2017-10-16 72 views
0

目前我有兩個JSON體: 1. globaljson 2. companyjson比較兩個JSON和JSON第一的Java返回唯一關鍵

globaljson:

"dS": { 
     "a": 5, 
     "b": false, 
     "c": 5, 
     "d": false, 
     "e": 1, 
     "f": 5, 
     "g": 33.528, 
     "h": false 
    } 

公司JSON:

"dS": { 
    "a": 90 
    }, 

預計產量:

"dS": { 
      "a": 90, 
      "b": false, 
      "c": 5, 
      "d": false, 
      "e": 1, 
      "f": 5, 
      "g": 33.528, 
      "h": false 
     } 

我試圖做到以下幾點:

Map<String, Object> map1 = mapper.readValue(companyjson, Map.class); 
Map<String, Object> map2 = mapper.readValue(globaljson, Map.class); 
Map<String, Object> merged = new HashMap<String, Object>(map1); 
merged.putAll(map2); 

但這返回當前使用傑克遜庫

"dS": { 
    "a": 90 
    }, 

即時消息,但無法找到,解決了我的要求的任何方法。我不想對我的密鑰進行硬編碼,因爲密鑰名稱可能在將來發生變化。

+1

外JSON對象的關鍵是'dS'而不是像'「一個」等內的對象。因此,您正在替換'dS'的值。你明白嗎?這應該是非常明顯的。 – AKSW

+0

不要看到任何錯誤。你可以嘗試convertvalue而不是readvalue方法。我假設你在合併之前驗證了map1和map2。 – surya

回答

0

合併之前...

  • map1必須是:{dS={a=90}}
  • map2必須是:{dS={a=5, b=false, c=5, d=false, e=1, f=5, g=33.528, h=false}}

那麼這行後...

Map<String, Object> merged = new HashMap<String, Object>(map1); 

.. .. merged必須是:{dS={a=90}}

此行後則...

merged.putAll(map2); 

... merged必須{dS={a=5, b=false, c=5, d=false, e=1, f=5, g=33.528, h=false}}因爲putAll效果是關鍵dS中值來代替merged關鍵dS的價值map2。換一種方式;您正在合併兩個包含名爲dS的鍵的映射,並希望合併對內容dS敏感,而合併實際上只是將其中一個dS的值替換爲其他dS的值。

爲了讓你有你想要的結果合併下dS其存在的地圖,例如:

Map<String, Object> map1 = mapper.readValue(companyJson, Map.class); 
Map<String, Object> map2 = mapper.readValue(globalJson, Map.class); 

Map<String, Object> globalMap = (Map) map2.get("dS"); 
Map<String, Object> companyMap = (Map) map1.get("dS"); 
globalMap.putAll(companyMap); 

上面的代碼導致map2具有以下內容:

{dS={a=90, b=false, c=5, d=false, e=1, f=5, g=33.528, h=false}} 
+0

是的,可以工作,但我不想在我的代碼中硬編碼鍵名,因爲JSON鍵可能會在將來改變,所以我正在尋找一種方式,以便我可以擺脫硬編碼鍵名稱。 –

+0

你不能'putAll'並期望該命令對'dS'的內容敏感或者換句話說;如果您使用'dS'_處理''deal',那麼只能合併'dS'的內容,這需要知道密鑰的名稱或應用某種查詢技術,例如:'迭代密鑰集,並且如果找到值然後將其與其他地圖中相同鍵名的值合併。 – glytching

0

最簡單的選擇是使用JsonNode而不是Map和jackson映射器來執行合併。

ObjectMapper mapper = new ObjectMapper(); 

JsonNode node = mapper.readValue(json1, JsonNode.class); 
JsonNode node2 = mapper.readValue(json2, JsonNode.class); 
JsonNode result = mapper.updateValue(node, node2); 

// if you really need a map 
Map merged = mapper.convertValue(result, Map.class); 

替代版本

JsonNode node = mapper.readValue(json1, JsonNode.class); 
ObjectReader updater = mapper.readerForUpdating(node); 
JsonNode result = updater.readValue(json2);