有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (4) 个答案

  1. # 1 楼答案

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

    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
        // ...
    }
    
  2. # 2 楼答案

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

    如果有Json,我会将其字符串化。如果stringized对象中的{索引为0,则为Json对象;如果stringized对象中的{索引为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
    
  3. # 3 楼答案

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

  4. # 4 楼答案

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