Java / JSON类混淆

时间:2017-12-20 18:14:07

标签: java json deserialization

我最近开始使用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";

OR

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

这到底是怎么回事?

1 个答案:

答案 0 :(得分:0)

如果storesData.get(i).getClass()不等于JSONObject或至少JSONObject子类,则在运行时会出现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