【问题标题】:JSONArray Parsing errorJSONArray 解析错误
【发布时间】:2015-06-04 14:30:19
【问题描述】:

我在解析 JSON 数组方面需要帮助。

[
    {
        "Header1": [
            {
                "path": "upload/images/1430572021716.jpg"
            },
            {
                "path": "upload/images/1430574003703.jpg"
            }
        ]
    },
    {
        "Header2": [
            {
                "path": "upload/images/1430574124119.jpg"
            },
            {
                "path": "upload/images/1430574203001.jpg"
            }
        ]
    }
]

我完美地收到了上面的 JSONArray。我想遍历数组并提取标题文本“Header1”和路径的值

我不断遇到以下错误消息

at 0 of type org.json.jsonarray cannot be converted to jsonobject

经过一番研究,这是由于系统无法解析为 JSON 数组。如果我将“列表”数组更改为一个对象,它确实有效,但是这不是一个数组,我失去了迭代它的能力。

这是我尝试解析数组的代码

    JSONArray mArray;

    mArray = json;

    //download json array
    for (int i = 0; i < mArray.length(); i++) {
        if(mArray != null) {
            JSONArray list = mArray.getJSONArray(i);
            if(list != null) {
                for(int a = 0; a < list.length();a++) {
                    JSONObject elem = list.getJSONObject(a);
                    if (elem != null) {
                            listdata.add(elem.getString("path"));

                    }
                }
            }
        }
    }

【问题讨论】:

  • 您的 JSON 响应具有这种结构。 Array(Object(Array(Object)) 你在做什么,Array(Array(Object))
  • 我的目的是让您使用 POJO 对 JSON 进行建模,然后让 Gson 之类的东西为您解析它。看起来你的模型会很简单,这也会大大降低代码的圈复杂度。

标签: java android arrays json


【解决方案1】:

您试图将顶级数组的每个 element 视为另一个数组 - 它不是,它是一个对象。然后该对象具有另一个字段,其值 一个数组。所以你想要这样的东西:

for (int i = 0; i < json.length(); i++) {
    JSONObject container = json.getJSONObject(i);
    // We don't know the property name, but there's only one, apparently...
    String key = container.keys().next();
    JSONArray subarray  = container.getJSONArray(key);
    for (int j = 0; j < subarray.length(); j++) {
        listdata.add(subarray.getJSONObject(j).getString("path"));
    }
}

【讨论】:

    【解决方案2】:

    JSON 的第二层包含在 JSON 数组元素中。

    正如您已经提到的,您需要将它们作为JSONObject 获取。

    然后你 getJSONArray 来自那个对象:

    //download json array
    for (int i = 0; i < mArray.length(); i++) {
        if(mArray != null) {
            JSONObject element = mArray.getJSONObject(i);
            JSONArray list = element.getJSONArray("Header1");
            if(list != null) {
    

    但是,由于 "Header..." 键正在更改,您可能需要通过调用 keys() 来推断键。

    【讨论】:

      【解决方案3】:

      处理这个问题的一个更简单的方法是使用 GSON 库并创建 POJO 类来类似于你的 JSON 这里是一个很好的website to do that

      【讨论】:

        【解决方案4】:

        这适用于 JavaScript 并且非常简单。

        //mArray is your json array
        let newArray = JSON.stringify(mArray);
        mArray = JSON.parse(newArray);
        

        【讨论】:

        • 它是如何工作的? mArray 会不会和以前一样?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        相关资源
        最近更新 更多