【问题标题】:compare two json and return unique key from first json java比较两个 json 并从第一个 json java 返回唯一键
【发布时间】:2018-03-28 09:48:50
【问题描述】:

目前我有两个 json 正文: 1.全局json 2.公司json

全局json:

"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
  },

我目前正在使用杰克逊库,但找不到任何方法可以解决我的要求。我不想对我的密钥进行硬编码,因为将来密钥名称可能会更改。

【问题讨论】:

  • 外部 JSON 对象的键是 dS,而不是像 "a" ,etc. Thus, you're replacing the value of dS` 这样的内部对象。你明白吗?应该很明显了。
  • 看不出有什么问题。您可以尝试使用 convertvalue 而不是 readvalue 方法。我假设您在合并之前验证了 map1 和 map2。

标签: java json hashmap jackson compare


【解决方案1】:

合并前...

  • 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 的作用是将merged 中键dS 的值替换为map2 中键dS 的值。换一种方式;您正在合并两个映射,它们都包含一个名为 dS 的键,并希望合并对 dScontents 敏感,而合并实际上只是将一个 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,则只能合并dS 的内容,这需要知道密钥的名称或应用某种询问技术,例如:'迭代密钥集如果您找到 Map 类型的值,则将其与另一个映射中相同键名的值合并。
【解决方案2】:

最简单的选择是使用JsonNode 而不是Map 和jackson mapper 来执行合并。

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);

【讨论】:

    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 2020-06-04
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    相关资源
    最近更新 更多