我正在接收json,并尝试使用JSONObject和JSONArray类对其进行操作。我有嵌套对象,需要确定那些嵌套对象是数组还是对象。问题是,如果我假设它是一个对象,并且实际上是一个数组,则在我调用getJSONObject时会引发异常。我想知道是否唯一的方法就是添加try / catch块,或者是否有更好的方法来做到这一点。例如,说我有:

{"key1": "val1",
 "key2": {"level2": {"level3": "val3"}}
}


我可能还具有带有多个值的level2元素,并以数组形式出现:

{"key1": "val1",
 "key2": {"level2": [{"level3": "val3"}]}
}


我将如何提取level2对象(作为对象)并确定它是对象还是数组?使用字符串操作真正做到这一点的唯一方法是吗?

如果我做类似的事情:

jsonObj.getJSONObject("key2").getJSONObject("level2");


它将导致错误:“ org.json.JSONException:JSONObject [” level2“]不是JSONObject,反之,如果我调用getJSONArray(” level2“)并且level2不是数组,我将得到一条错误消息,表明它是不是数组。

最佳答案

您可以使用optJSONObject()optJSONArray()方法检查基础对象是对象还是数组。下面是一个示例。

JSONObject json = new JSONObject("{\"key1\": \"val1\",\n" +
        " \"key2\": {\"level2\": {\"level3\": \"val3\"}}\n" +
        "}");

JSONObject json1 = new JSONObject("{\"key1\": \"val1\",\n" +
        " \"key2\": {\"level2\": [{\"level3\": \"val3\"}]}\n" +
        "}");

if(json.getJSONObject("key2").optJSONObject("level2") != null) {
    System.out.println("json : it is a jsonobject");
}
else if(json.getJSONObject("key2").optJSONArray("level2") != null) {
    System.out.println("json : it is a jsonarray");
}


if(json1.getJSONObject("key2").optJSONObject("level2") != null) {
    System.out.println("json1 : it is a jsonobject");
}
else if(json1.getJSONObject("key2").optJSONArray("level2") != null) {
    System.out.println("json1 : it is a jsonarray");
}

10-08 19:50