我有一个返回格式的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。"
如何解析此查询?
答案 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();
}