【问题标题】:Java / JSON class confusionJava/JSON 类混淆
【发布时间】:2017-12-20 18:14:07
【问题描述】:

我最近开始使用 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】:

    如果 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

    【讨论】:

    • 好吧;我知道ClassCasting。我的问题是,当 IntelliJ 报告它已经是 JSONObject 时,为什么我必须将“storesData.get(i)”转换为 JSONObject。
    • 是什么让你认为 Idea 认为 storesData.get(i)JSONObject,给我看一个打印屏幕。
    • 在 IntelliJ 中查看表达式评估的结果;正在发布屏幕截图
    • 请再次阅读我的回答。当您的 InteJIi Idea 中 B.getInstance().getClass() 等于 B 时,您将面临这种情况。但是方法返回A,这就是为什么你需要B b = (B) B.getInstance();
    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2019-03-15
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多