有效的JSON未被识别为对象或数组

时间:2015-12-08 22:38:35

标签: android python json

我有一个返回格式的JSON的查询

[["e1", "[{"l1": "A", "l2": "B"}, {"l3": "C", "l4": "D"}]", "1"], ["e2", "[{"l5": "E", "l6": "F"}, {"l7": "G", "l8": "H"}]" , "2"]]

已经转储了Python列表以生成此JSON。我被告知格式为["标签"," JSON"," ID"]。 jsonlint.com显示JSON有效但我不知道如何从中提取对象/数组,在Android中解析它。

我收到错误,

" java.lang.String无法转换为JSONArray。"

"解析数据时出错org.json.JSONException:java.lang.String类型的值DOCTYPE无法转换为JSONObject。"

如何解析此查询?

2 个答案:

答案 0 :(得分:1)

您的json无效。

您有四个错误,请参阅下面的列表和相应的修复程序。

"[{"l1" -> [{"l1"
"D"}]" -> "D"}]
"[{"l5" -> [{"l5"
"H"}]" -> "H"}]

最终结果是:

[["e1", [{"l1": "A", "l2": "B"}, {"l3": "C", "l4": "D"}], "1"], ["e2", [{"l5": "E", "l6": "F"}, {"l7": "G", "l8": "H"}] , "2"]]

希望它有所帮助。

答案 1 :(得分:1)

以布鲁诺的答案为基础。 JSON是无效的,即使Bruno在语法上有效,它在Android中仍然不是很容易解析。 JSON基于键值对。 Android的JSON实现需要这种结构。为了从该JSON中提取第一个数组,您需要将该键指定为String以获得访问权限(JSON没有这个权限)。我相信你仍然可以通过使用他们的钥匙来取出价值。

请考虑以下内容,向您展示如何根据Bruno更正的JSON JSONObject创建String

try {
    JSONObject jsonObject = new JSONObject("[[\"e1\", [{\"l1\": \"A\", \"l2\": \"B\"}, {\"l3\": \"C\", \"l4\": \"D\"}], \"1\"], [\"e2\", [{\"l5\": \"E\", \"l6\": \"F\"}, {\"l7\": \"G\", \"l8\": \"H\"}] , \"2\"]]");
    JSONArray parentArray = jsonObject.getJSONArray("WHAT IS THIS KEY?");
} catch (JSONException e) {
    e.printStackTrace();
}

您甚至无法解析父数组,因为它没有密钥,getJSONArray()optJSONArray()都需要String密钥。

如果您只是在寻找JSONArray,那么您可以像我在上面演示的一样,将JSONObject替换为JSONArray来实例化它。

try {
    JSONArray jsonArray = new JSONArray("[[\"e1\", [{\"l1\": \"A\", \"l2\": \"B\"}, {\"l3\": \"C\", \"l4\": \"D\"}], \"1\"], [\"e2\", [{\"l5\": \"E\", \"l6\": \"F\"}, {\"l7\": \"G\", \"l8\": \"H\"}] , \"2\"]]");
    //JSONArray parentArray = jsonObject.getJSONArray("WHAT IS THIS KEY?");
} catch (JSONException e) {
    e.printStackTrace();
}