我正在解析应用程序中的一些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,我现在卡在了解如何解析结果。
答案 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网站。