Android:将String转换为JSONObject时出现异常

时间:2013-08-22 20:02:47

标签: java android json

当我尝试将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”部分......

3 个答案:

答案 0 :(得分:2)

您似乎误解了org.json库的工作原理。

JSON homepage所述,JSON值可以是字符串,数字,对象,数组,true / false或null。该库将这些值类型映射到StringNumber子类,JSONArrayJSONObjectBooleannull

并非该库中的所有内容都是JSONObject实际上,JSONObject 具体用于表示名称/值对对象。 JSONObject.get()可能会返回上述值类型的任何,这就是为什么它需要回归到最大公分母类型:Object(和不是 JSONObject)。因此,将所有内容都转换为JSONObject将无效。

您的责任确保您使用您对传入数据结构的了解来投射到正确的类型。在您的情况下,这似乎是一个问题:您的JSON字符串包含字符串(适用于namelocationtypestatus),整数(适用于difficultyterrain)和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