比较两个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
},
即时消息,但无法找到,解决了我的要求的任何方法。我不想对我的密钥进行硬编码,因为密钥名称可能在将来发生变化。
合并之前...
-
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}}
是的,可以工作,但我不想在我的代码中硬编码键名,因为JSON键可能会在将来改变,所以我正在寻找一种方式,以便我可以摆脱硬编码键名称。 –
你不能'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);
外JSON对象的关键是'dS'而不是像'“一个”等内的对象。因此,您正在替换'dS'的值。你明白吗?这应该是非常明显的。 – AKSW
不要看到任何错误。你可以尝试convertvalue而不是readvalue方法。我假设你在合并之前验证了map1和map2。 – surya