试图在jsonarray中解析jsonarray

时间:2014-01-19 01:34:36

标签: android json

我正在解析应用程序中的一些json,而且我遇到了有时会在其中包含信息的数组:

{
    "output": [
        {
            "id": "1521",
            "name": "Apples",
        }
    ]
}

有时什么都没有。 e.g

{
    "output": [
        []
    ]
}

我正在通过

解析它
JSONArray output = c.getJSONArray("output");
int outputLength = output.length();

for (int q = 0; q < outputLength; q++) 
{
    JSONObject d = outputs.getJSONObject(q);
    id[q] = d.getInt("id");
    name[q] = d.getString("name");
}

但是当它到达空数组时它会崩溃。 然后我收到以下错误:

01-19 01:08:00.237: W/System.err(17627): org.json.JSONException: Value [] at 0 of type org.json.JSONArray cannot be converted to JSONObject
它失败了,因为它试图将jsonarray转换为一个对象,你不能这样做,所以我试着在输出中得到第一个数组:

JSONArray add = output.getJSONArray(0);

但也会崩溃,因为在第一个输出中它是一个对象,而不是一个数组。 我没有访问或控制json feed,我现在卡在了解如何解析结果。

2 个答案:

答案 0 :(得分:3)

真正的答案是:“修复生成那个可怕的JSON的东西”。

如果这不是一个选项,那么在尝试访问它之前,你必须弄清楚你拥有的具体内容。 JSONArray.optJSONObject()方法有助于此;如果指定的索引不包含null

,则返回JSONObject
JSONArray output = c.getJSONArray("output");
for (int q = 0; q < outputLength; q++) 
{
    JSONObject d = output.optJSONObject(q);
    if (d != null)
    {
        id[q] = d.getInt("id");
        name[q] = d.getString("name");
    }
}

答案 1 :(得分:-1)

因为您要将封闭的JSONArray中的所有内容解析为JSONObject,所以所有条目都必须以这种方式进行格式化。要使其工作,您的源字符串必须如下所示:

[
{
    "output": [
        {
            "id": "1521",
            "name": "Apples"
        }
    ]
},
{
    "output": [
        []
    ]
}
]

顶级JSONArray中的所有内容现在都是JSONObject,可以相应地进行解析。这些对象的内部是你的业务(空数组是可以的)。检查给定JSON字符串是否有效的良好资源是this网站。