当我尝试将JSON字符串转换为JSONObject时,我收到以下错误。
值 48.466667 | 9.883333 在java.lang.String类型的位置 无法转换为JSONObject
String是有效的JSON,我使用http://jsonlint.com/
进行了测试实施例: {“name”:“An der Decke”,“location”:“ 48.412583 | 10.0385 ”,“type”:“Virtual”,“size”:null,“status”:“Available”, “难”:1, “等级”:NULL, “地形”:1}
产生异常的代码如下所示:
jsonObject = new JSONObject(result);
jsonArray = new JSONArray();
Iterator<String> iter = jsonObject.keys();
while (iter.hasNext()) {
String key = iter.next();
try {
JSONObject value = (JSONObject) jsonObject.get(key); <---- Exception
jsonArray.put(value);
} catch (JSONException e) {
// Something went wrong!
}
}
是管道符号不是Java JSON中的有效字符?
编辑:
问题是,如果JSON字符串不包含“location”,它可以正常工作:“48.412583 | 10.0385”部分......
答案 0 :(得分:2)
您似乎误解了org.json
库的工作原理。
如JSON homepage所述,JSON值可以是字符串,数字,对象,数组,true / false或null。该库将这些值类型映射到String
,Number
子类,JSONArray
,JSONObject
,Boolean
或null
。
并非该库中的所有内容都是JSONObject
。实际上,JSONObject
具体用于表示名称/值对对象。 JSONObject.get()
可能会返回上述值类型的任何,这就是为什么它需要回归到最大公分母类型:Object
(和不是 JSONObject
)。因此,将所有内容都转换为JSONObject
将无效。
您的责任确保您使用您对传入数据结构的了解来投射到正确的类型。在您的情况下,这似乎是一个问题:您的JSON字符串包含字符串(适用于name
,location
,type
和status
),整数(适用于difficulty
和terrain
)和nulls(对于size
)。你想用这些完全的是什么?
答案 1 :(得分:0)
JSONObject
的{{3}}方法会返回Object
类型的结果。在这种情况下,它似乎是String
。就好像你在做什么
JSONObject value = (JSONObject) new String("asdasdsa");
这显然没有意义,因为它们是不兼容的类型。
相反,检索该值,从中创建JSONObject
并将其添加到JSONArray
。
答案 2 :(得分:0)
如果您的目标只是获取所有JSON字符串值的JSONArray
,那么可以采用更简单的方法。
JSONObject jsonObject = new JSONObject(result);
JSONArray jsonArray = jsonObject.toJSONArray(jsonObject.names());
System.out.println(jsonArray); // prints:
// [1,"Available","48.412583|10.0385","An der Decke",1,null,"Virtual",null]
除此之外,假设JSON中封装的每个值都是JSON对象本身是错误的。事实上,在你的情况下,没有一个是。 JSON中所有值的正确类型是
// String
System.out.println(jsonObject.getString("name")); // An der Decke
System.out.println(jsonObject.getString("location")); // 48.412583|10.0385
System.out.println(jsonObject.getString("type")); // Virtual
System.out.println(jsonObject.getString("status")); // Available
// Null
System.out.println(jsonObject.isNull("size")); // true
System.out.println(jsonObject.isNull("rating")); // true
// Integer
System.out.println(jsonObject.getInt("terrain")); // 1
System.out.println(jsonObject.getInt("difficulty")); // 1
另一方面,如果您的name
是一个由名字,姓名和姓氏组成的嵌入式JSON对象,那么您的JSON字符串(为了简洁而忽略其余的键)看起来就像
{"name": {"fname" : "An", "mname" : "der", "lname" : "Decke"}}
现在,我们可以使用getJSONObject()
,因为我们确实有一个嵌入式JSON对象。
JSONObject jsonObj = new JSONObject("{\"name\":
{\"fname\" : \"An\", \"mname\" : \"der\", \"lname\" : \"Decke\"}}");
// get embedded "name" JSONObject
JSONObject name = jsonObj.getJSONObject("name");
System.out.println(name.getString("fname") + " "
+ name.getString("mname") + " "
+ name.getString("lname")); // An der Decke