【问题标题】:Can't get value from JSONObject无法从 JSONObject 获取值
【发布时间】:2018-12-09 00:35:28
【问题描述】:

所以我正在使用简单的 json 库来执行一些 json 操作。现在我可以从 json 字符串构造一个 JSONObject,但我无法从我创建的对象中获取值。 例如,如果我这样做:

String value = (String) jsonRecord.get("Key");

我会收到一条错误消息:

java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to java.lang.String

我删除了转换为字符串的类型,它在 IntelliJ 中工作。但是,当我在命令行执行此操作时,它会给我一个错误提示:

error: incompatible types: Object cannot be converted to String

架构如下:

    {   
       "myArray": {
          "array": ["Decaf mocha", "Vanilla mocha", "Chai Latte"]
       },
        "Item": {
          "string": "Decaf macha"
        }
    }

更新:toString() 修复了该问题。但是当我试图获取我得到的数组时:

java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to org.json.simple.JSONArray

有人可以建议如何解决这个问题吗?谢谢!

【问题讨论】:

  • 您是否阅读了错误信息?你认为这意味着什么?
  • @JBNizet 是的,我已经阅读了错误消息,我认为它声称 get 方法返回的对象不能转换为对我来说没有意义的字符串。我可以使用 system.out.println 打印该值,所以理论上我应该能够将其转换为字符串。
  • 错误表示jsonRecord.get("Key")正在返回一个JSONObject,尝试在其上使用.toString()

标签: java json simplejson


【解决方案1】:

您的值是 JSONObject,而不是字符串。您的错误消息很清楚。如果你真的想要它作为一个字符串,使用

String value = jsonRecord.get("Key").toString();

您可以将任何对象传递给 System.out.println,而不仅仅是字符串,但要真正将其转换为字符串,您需要自己调用 toString()

但是,如果您期望一个实际的 String 作为 Key,而不是 JSONObject,那么您应该再看看您的 JSON,因为您做错了什么。

更新:

好的,看看你的架构,我发现了问题。您的 JSON 不是直接将键映射到值,而是将键映射到然后包含值的对象。因此,要在您发布的 JSON 中获取数组,而不是

value = jsonRecord.get("myArray")

你会使用

JSONArray value = jsonRecord.getJSONObject("myArray").getJSONArray("array");

对于字符串,你会使用

String value = jsonRecord.getJSONObject("Item").getString("string");

【讨论】:

  • 感谢您的建议。我已经用模式更新了这个问题。我猜架构有问题?你能看一下吗?
【解决方案2】:

只需添加当前的“org.json”依赖项即可解决您的问题,因为最新版本包含返回 Object 的 get() 方法(JSONObject 类)。

下面是我的maven依赖:-

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20190722</version>
</dependency>

以下是我执行获取键操作的代码。

public void iterateJsonObject(JSONObject jsonObj) {
        jsonObj.keySet().forEach(keyStr ->
        {
            Object keyvalue = jsonObj.get(keyStr);
            System.out.println("key: "+ keyStr + " value: " + keyvalue);
        });
    }

【讨论】:

    【解决方案3】:

    您可以通过使用泛型来防止 ClassCastException,因为泛型提供编译时检查并可用于开发类型安全的应用程序。

    【讨论】:

      【解决方案4】:

      您没有将要获取的 json 记录值转换为字符串。

      String value = String.valueOf(jsonRecord.get("Key"));
      

      他应该可以解决您的问题。您也可以使用 toString() 方法,但我个人更喜欢 String.valueOf() ,因为有时 toString() 往往会给出垃圾值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多