2016-06-08 33 views
0

,我有以下結構的一個HashMap: -未知深度嵌套地圖查詢鍵的存在和獲得價值

mymap = {a:{b:{c:{d:{e}}}} 

如何檢查的關鍵「d」的所有腦幹中的HashMap MyMap中最簡單的方法是什麼? 有什麼可以派上用場的Java8功能嗎?

mymap.get("a")).get("b")..; 

是行不通的,因爲我不知道在哪個d嵌套的水平。 如何檢查地圖中是否存在d,並在沒有此追蹤調用的情況下獲取其值?提前致謝。

回答

1

您可以使用FasterXML-Jackson庫,它爲您提供遍歷nesed json的簡單性。

例如:

ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally 
String myMapJson = "{\"a\":{\"b\":{\"c\":{\"d\":{\"e\":\"\"}}}}" 
JsonNode data = mapper.readTree(myMapJson); 
boolean hasKey = data.has("d"); 

或者,如果你已經有了對象Map你可以寫爲json,然後加載它上面的一樣:

ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally 
String jsonData = mapper.writeValueAsString(myMapObject); 
JsonNode data = mapper.readTree(jsonData); 
boolean hasKey = data.has("d"); 
if (hasKey) { 
    JsonNode result = data.findValue("d"); 
} 
+0

我可以做一個data.get?取值? – Tania

+1

是的,您可以使用'get(String key)'提取值,但如果密鑰不存在,您將收到'null',所以最好使用'path(String key)'以避免'null'值,你將得到一個對象調用'MissingNode'。如果你想獲得嵌套的鍵,你可能需要使用:'findValue(String key)' –

+0

我得到這個:[java] com.fasterxml.jackson.core.JsonParseException:意外的字符('A'(代碼65 )):期待雙引號開始字段名稱。 我的字段名稱不會用雙引號打開。我如何繞過這個? – Tania

2

最近我有一個類似的問題,並設法提出了一個解決方案,可以與任何JSON深度一起工作。

這是一個解決方案,它將字符串轉換爲JsonNode對象,然後嘗試查找給定fieldName的父值(在本例中爲'd')。返回非空值的結果會告訴你值是否存在。

ObjectMapper mapper = new ObjectMapper(); 
String myMapJson = "{\"a\":{\"b\":{\"c\":{\"d\":{\"e\":\"\"}}}}" 
JsonNode data = mapper.readTree(myMapJson); 
if (((ObjectNode)data.findParent("d")) != null) { 
    // Do something if value is found 
} else { 
    // Do something if value is not found 
} 

希望這有助於..