比较两个JSON和JSON第一的Java返回唯一关键

问题描述:

目前我有两个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

合并之前...

  • 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

最简单的选择是使用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);