解析 JSON 对象中的 JSON 数组

47

我有一些具有以下结构的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");
}

我在第二行遇到了以下异常:

org.json.JSONException: JSONArray initial value should be a string or collection or array.
请指导我在哪里犯了错误,以及如何纠正它。

你的源代码没有问题,我已经尝试过了。 - Weidian Huang
5个回答

52

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

带有对象参数的 JSONArray 构造函数期望它是集合或数组(而不是 JSONArray)

尝试这个:

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

3
我们该如何解析这样的JSON数据?[{"id":"1","name":"ABC"},{"id":"2","name":"XYZ"}] (注:JSON是一种轻量级的数据交换格式,常用于前后端数据传输以及存储。) - Thompson
这可能有所帮助:json = "{"m"="+json+"}"; 现在可以通过名称“m”进行解析。 - Anuj Jindal

10

您的代码没问题,只需替换以下行:

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

使用这条线:

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

如果接收到的数据格式是 [{dict1},{dict2},{dict3}] 呢? - marciokoko
JSONArray list = new JSONArray(jsonString); - Jackie

0

第二行应该是

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

对于第三行,我需要做

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

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");

你的数组看起来像这样: [ { "id":1001, "name":"jhon" }, { "id":1002, "name":"jhon" } ] 你可以使用:
arr.getJSONObject(index)

获取数组内的对象。


-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");
}

您能否详细阐述一下您的答案,并对您提供的解决方案进行更多描述? - abarisone
迭代时没有引用回“i”,导致无法正常工作。 - Hortitude
无法将字符串转换为JSONArray,这不起作用。 - Weidian Huang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接