所以我正在使用简单的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
有人可以建议如何解决该问题吗?谢谢!
答案 0 :(得分:1)
您的值是JSONObject,而不是字符串。您的错误消息很清楚。如果您确实希望将其用作字符串,请使用
String value = jsonRecord.get("Key").toString();
您可以将任何对象(不仅是字符串)传递给System.out.println,而且要将其实际转换为字符串,您需要自己调用toString()
。
但是,如果您期望将实际的字符串作为Key
,而不是JSONObject,则应该再看一下JSON,因为您做错了事。
更新:
好的,看看您的架构,我看到了问题。 JSON不会将键直接映射到值,而是将键映射到包含值的对象。因此,要在您发布的JSON中获取数组,而不是
value = jsonRecord.get("myArray")
您将使用
JSONArray value = jsonRecord.getJSONObject("myArray").getJSONArray("array");
对于字符串,您将使用
String value = jsonRecord.getJSONObject("Item").getString("string");
答案 1 :(得分:1)
只需添加当前的“ org.json”依赖项即可解决您的问题,因为最新版本拥有get()方法(JSONObject类),该方法返回Object。
以下是我的Maven依赖项:-
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20190722</version>
</dependency>
下面是我执行get key操作的代码。
public void iterateJsonObject(JSONObject jsonObj) {
jsonObj.keySet().forEach(keyStr ->
{
Object keyvalue = jsonObj.get(keyStr);
System.out.println("key: "+ keyStr + " value: " + keyvalue);
});
}
答案 2 :(得分:0)
您可以通过使用泛型来防止ClassCastException,因为泛型提供了编译时检查,并可用于开发类型安全的应用程序。
答案 3 :(得分:0)
您没有将要获取的json记录值转换为字符串。
String value = String.valueOf(jsonRecord.get("Key"));
他应该解决您的问题。您也可以使用toString()方法,但我个人更喜欢String.valueOf(),因为有时toString()倾向于提供垃圾值。