Java / JSON类混淆

问题描述 投票:-1回答:1

我最近开始使用Java,来自Perl,Ruby,JavaScript和bash的长期背景,我从服务中获取JSON对象并希望用Java处理它。

我的JSON对象如下所示:

{
  "stores": {
    "store": [
      {
        "id": 123,
        "name": "My Store Name",
        "address": {...},
        "locationNumber": 4567,
        "storeNumber": 890,
        "divisionId": "7",
        "schedule": {...},
        "attributes": {...},
        "features": {...},
        ...

我有一个服务模块,它返回商店的JSONArray,我能够通过以下表达式获取我想要的数据:

storesData.getJSONObject(i).getString("name") + "\n";

要么

Assert.assertTrue(attributes.getJSONObject(j).getJSONArray("value").get(0).equals("TRUE"))

现在我想从数组中选择一个商店(按名称)并返回另一个JSONArray,只将该商店作为数组中的唯一元素。所以我编码了这个:

for(int i = 0; i < storesData.length(); i++) {
  JSONObject jObj = storesData.get(i);
  ---

但它没有说storesData.get(i)不是JSONObject。我不得不像这样投射结果:

JSONObject jObj = (JSONObject) storesData.get(i);

即使在调试器(IntelliJ-IDEA)中,这一行:

storesData.get(i).getClass()

报告了一类JSONObject。更新截图Screenshot

到底发生了什么事?

java json deserialization
1个回答
0
投票

如果storesData.get(i).getClass()不等于JSONObject或至少JSONObjectchild类,那么在运行时会得到ClassCastException。

你的storesData返回类型不是JSONObject,而是JSONObject甚至Object的祖先。单击Idea中的storesData,然后转到变量声明以查看其类型。

更多例子:

class A {
 static Object getInstance() {
     return "invalid object";
  }
}
class B extends A {
  static A getInstance() {
     return new B()
  }
}

B b = B.getInstance();  // compilation error
A a = B.getInstance(); // works
B b = (B) B.getInstance(); // works as well
A a = A.getInstance(); // compilation error
A a = (A) A.getInstance(); // ClassCastException

你想在java中阅读有关ClassCasting的内容。

© www.soinside.com 2019 - 2024. All rights reserved.