Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何检测嵌入的JSON元素是JSONObject还是JSONArray_Java_Json - Fatal编程技术网

在Java中,如何检测嵌入的JSON元素是JSONObject还是JSONArray

在Java中,如何检测嵌入的JSON元素是JSONObject还是JSONArray,java,json,Java,Json,我正在接收json,并尝试使用JSONObject和JSONArray类对其进行操作。我有嵌套对象,需要确定这些嵌套对象是数组还是对象。问题是,如果我假设它是一个对象,而实际上是一个数组,那么当我调用getJSONObject时,就会引发一个异常。我想知道这样做的唯一方法是添加try/catch块还是有更好的方法。例如,假设我有: {"key1": "val1", "key2": {"level2": {"level3": "val3"}} } 我还可以使用具有多个值的level2元素,并将

我正在接收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不是数组,我将得到一个错误,表明它不是数组。

使用'jsonObj.get(“level2”)'并检查类型是否为JsonArray,然后尝试强制转换它。

如果您愿意使用的模块,那么它非常简单:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;

// ...

// parse your JSON data into a JsonNode
JsonNode jsonObj = new ObjectMapper().readTree(yourJsonString);

// should really do some error checking here unless you're 100% sure
// you're always going to be getting "key2" and "level2" in your JSON
// data structure; look into Jackson's "hasNonNull()" function
JsonNode level2 = jsonObj.get("key2").get("level2");

if (level2.isArray()) {
    ArrayNode level2arr = (ArrayNode)level2;
    // ... do something with level2arr as an array
    // ...
} else if (level2.isObject()) {
    // ... use it as an object node
    // ...
}

我将字符串化JSON对象并检查“{”或“[”的索引。

给定一个Json,我会将其字符串化。如果字符串化对象中的“{”索引为0,则它是一个Json对象;如果字符串化对象中的“[”索引为0,则它是一个Json数组

我使用Vertx框架,我可以按如下方式进行验证:

JsonObject jsonObject = new JsonObject().put("name", "avishek");
JsonArray jsonArray = new JsonArray().add("Vizury").add("MediaIQ");

System.out.println(jsonObject.toString().indexOf("{") == 0); //Json Object
System.out.println(jsonArray.toString().indexOf("[") == 0); //Json Array

您可以使用
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");
}

我认为这里的解决方案是更好地命名键,并且事先知道您要解析什么。换句话说,有一个一致的模式问题是json来自XML-to-json转换器,如果json模式打算有一个元素作为数组,但元素只有一个元素,那么转换器没有wa要知道单个元素仅是一个对象或数组中的单个元素。您使用哪个库进行json分析转换器应该知道单个元素数组和object.org.json库之间的区别。JSONException:JSONObject[“level2”]找不到。我想这是因为它是一个嵌入式对象,我需要一些方法来引用“get”方法中的key2.level2。如果有一种方法可以使用“get”方法引用嵌套对象,我认为这将是最好的方法。太好了……这就是我要寻找的。非常感谢。很高兴它有帮助!