比较两个json并从第一个json java返回唯一键
目前我有两个json主体: 1.globaljson 2.公司JSON globaljson:比较两个json并从第一个json java返回唯一键,java,json,hashmap,jackson,compare,Java,Json,Hashmap,Jackson,Compare,目前我有两个json主体: 1.globaljson 2.公司JSON globaljson: "dS": { "a": 5, "b": false, "c": 5, "d": false, "e": 1, "f": 5, "g": 33.528, "h": false } 公司名称: "dS": { "a": 90 }, 预期产出: "dS": { "
"dS": {
"a": 5,
"b": false,
"c": 5,
"d": false,
"e": 1,
"f": 5,
"g": 33.528,
"h": false
}
公司名称:
"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);
我目前正在使用jackson库,但找不到任何解决我需求的方法。我不想硬编码我的密钥,因为密钥名称将来可能会更改。合并前
必须是: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.putAll(map2);
merged
必须是{dS={a=5,b=false,c=5,d=false,e=1,f=5,g=33.528,h=false}
,因为putAll
的作用是将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);
合并之前
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.putAll(map2);
merged
必须是{dS={a=5,b=false,c=5,d=false,e=1,f=5,g=33.528,h=false}
,因为putAll
的作用是将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);
最简单的选择是使用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);
最简单的选择是使用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
,而不是“a”等内部对象。因此,您正在替换dS`的值。你明白吗?这应该是很明显的。不要认为有什么不对。可以尝试convertvalue而不是readvalue方法吗。我假设您在合并之前验证了map1和map2。外部JSON对象的键是dS
,而不是“a”等内部对象。因此,您正在替换dS`的值。你明白吗?这应该是很明显的。不要认为有什么不对。可以尝试convertvalue而不是readvalue方法吗。我假设您在合并之前验证了map1和map2。是的,这是可行的,但我不想在代码中硬编码键名称,因为json键将来可能会更改,所以我正在寻找一种方法,以便摆脱硬编码键名称。您不能putAll
并期望该命令对dS
的内容敏感,或者这是另一种方式;如果处理dS
,则只能合并dS
的内容,这需要知道密钥的名称或应用某种查询技术,例如:“迭代密钥集,如果找到类型为Map的值,则将其与另一个Map中相同密钥名称的值合并”。是的,但我不要在我的代码中硬编码键名,因为json键将来可能会更改,所以我正在寻找一种方法,以便摆脱硬编码键名。你不能putAll
,并期望该命令对dS
的内容敏感,或者换一种方式;如果处理dS
,则只能合并dS
的内容,这需要知道密钥的名称或应用某种查询技术,例如:“迭代密钥集,如果找到类型为Map的值,则将其与另一个Map中相同密钥名称的值合并”。