2017-09-16 83 views
1

我正在接收json並試圖使用JSONObject和JSONArray類對其進行操作。我有嵌套對象,需要確定這些嵌套對象是數組還是對象。問題是,如果我假設它是一個對象,並且它實際上是一個數組,那麼當我調用getJSONObject時,會引發異常。我想知道是否只有添加try/catch塊或者是否有更好的方法來做到這一點。例如,假設我有:如何檢測嵌入式JSON元素是否是Java中的JSONObject或JSONArray

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

我還可以具有多個值的級別2元件和進來作爲數組:

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

如何將提取級別2對象(作爲一個對象)並確定它是一個對象還是一個數組?使用字符串操作真正做到這一點的唯一方法是?

如果我做這樣的事情:

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

這將導致一個錯誤: 「org.json.JSONException:JSONObject的[」 級別2 「]不是一個JSONObject和conversly,如果我叫getJSONArray(」 level2「)和level2不是數組我會得到一個錯誤,指示它不是一個數組。

+1

我認爲這裏的解決方案是更好地命名密鑰,只是知道你想要解析什麼。換句話說,有一個一致的模式 –

+0

問題是,json是從XML到JSON轉換器,如果json模式旨在將一個元素作爲一個數組,但該元素只有一個元素,轉換器沒辦法知道單個元素只是一個數組中的一個對象或單個元素。 – GregH

+0

您正在使用哪個庫進行json解析 –

回答

2

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

優秀...這就是我一直在尋找。非常感謝。 – GregH

+0

很高興它幫助! –

0

使用'jsonObj.get(」level2)「並檢查類型是否爲JsonArray,然後嘗試轉換它。

+0

不能這樣做。我得到JSONException:JSONObject [「level2」]找不到。我認爲這是因爲它是一個嵌入對象,我需要一些方法來引用「get」方法中的key2.level2。如果有一種方法使用「get」方法引用嵌套對象,我認爲這將是最好的方法。 – GregH

0

如果你打開使用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 
    // ... 
} 
0

我將字符串化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 
相關問題