【问题标题】:Parsing JSON Array within JSON Object在 JSON 对象中解析 JSON 数组
【发布时间】:2011-08-04 17:51:20
【问题描述】:

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

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

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

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.

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

【问题讨论】:

  • 你的源代码没有问题,我已经试过了。

标签: java json parsing


【解决方案1】:

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

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

试试这个:

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

【讨论】:

  • 我们怎样才能像这样解析 JSON? [{"id":"1","name":"ABC"},{"id":"2","name":"XYZ"}]
  • 这可能有助于 json = "{\"m\"="+json+"}";现在按名称“m”解析。
【解决方案2】:

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

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

用这一行:

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

【讨论】:

  • 如果接收到的数据格式是[{dict1},{dict2},{dict3}]怎么办?
  • JSONArray 列表 = 新 JSONArray(jsonString);
【解决方案3】:

第 2 行应该是

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

对于第 3 行,我必须这样做

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

【讨论】:

    【解决方案4】:
    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 看起来像:[ { “身份证”:1001, “名称”:“约翰” }, { “身份证”:1002, “名称”:“约翰” } ] 您可以使用:

    arr.getJSONObject(index)
    

    获取数组内的对象。

    【讨论】:

      【解决方案5】:

      这可能是您问题的答案:

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

      【讨论】:

      • 能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?
      • 不起作用 - 迭代时不引用回“i”
      • 无法将字符串转换为 JSONArray,这不起作用
      猜你喜欢
      • 2015-06-02
      • 1970-01-01
      • 2016-05-31
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2015-04-26
      相关资源
      最近更新 更多