在JSON对象中解析JSON数组

时间:2011-04-13 13:36:25

标签: java json parsing

我有一些JSON具有以下结构:

{"source":[
           {"name":"john","age":20},
           {"name":"michael","age":25},
           {"name":"sara", "age":23}
         ]
}

我已将此JSON字符串命名为mainJSON。我正在尝试使用以下Java代码访问元素“name”和“age”:

JSONArray jsonMainArr = new JSONArray(mainJSON.getJSONArray("source"));
for (int i = 0; i < jsonMainArr.length(); i++) {  // **line 2**
     JSONObject childJSONObject = jsonMainArr.getJSONObject(i);
     String name = childJSONObject.getString("name");
     int age     = childJSONObject.getInt("age");
}

我在第2行显示以下例外:

org.json.JSONException: JSONArray initial value should be a string or collection or array.

请指导我在哪里犯错误以及如何纠正这个问题。

5 个答案:

答案 0 :(得分:50)

mainJSON.getJSONArray("source")会返回JSONArray,因此您可以删除new JSONArray.

带有object参数的JSONArray构造函数需要它是Collection或Array(而不是JSONArray)

试试这个:

JSONArray jsonMainArr = mainJSON.getJSONArray("source"); 

答案 1 :(得分:9)

您的代码很好,只需替换以下行:

JSONArray jsonMainArr = new JSONArray(mainJSON.getJSONArray("source"));

这一行:

JSONArray jsonMainArr = mainJSON.getJSONArray("source");

答案 2 :(得分:0)

第2行应

for (int i = 0; i < jsonMainArr.size(); i++) {  // **line 2**

对于第3行,我不得不做

    JSONObject childJSONObject = (JSONObject) new JSONParser().parse(jsonMainArr.get(i).toString());

答案 3 :(得分:0)

private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
      sb.append((char) cp);
    }
    return sb.toString();
  }

 String jsonText = readAll(inputofyourjsonstream);
 JSONObject json = new JSONObject(jsonText);
 JSONArray arr = json.getJSONArray("sources");

你的arr会是这样的:[     {         &#34; ID&#34;:1001,         &#34;名称&#34;:&#34; JHON&#34;         },         {                 &#34; ID&#34;:1002,         &#34;名称&#34;:&#34; JHON&#34;         } ] 您可以使用:

arr.getJSONObject(index)

获取数组内的对象。

答案 4 :(得分:-3)

这可能是您问题的答案:

JSONArray msg1 = (JSONArray) json.get("source");
for(int i = 0; i < msg1.length(); i++){
  String name = msg1.getString("name");
  int age     = msg1.getInt("age");
}