Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个json并从第一个json java返回唯一键_Java_Json_Hashmap_Jackson_Compare - Fatal编程技术网

比较两个json并从第一个json java返回唯一键

比较两个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": { "

目前我有两个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": {
          "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中相同密钥名称的值合并”。