首页 > 解决方案 > 如何使用java合并json中的重复键

问题描述

我的 json 看起来像

 {
      "data": [
        {
         "location":"hjjh",
         "latitude":"56.65765",
         "longitude":"65.6576"
        }
             ],
     "data": [
        {
         "location":"thfh",
         "latitude":"67.65765",
         "longitude":"5.6576"
        }
            ]
    }

如何使用 JAVA 将给定 json 的键合并到单个键,如下格式

{
  "data": [
    {
     "location":"hjjh",
     "latitude":"56.65765",
     "longitude":"65.6576"
    },
    {
     "location":"thfh",
     "latitude":"67.65765",
     "longitude":"5.6576"
    }
        ]
}

在 json中组合重复键中讨论了同样的问题 谁能告诉我 java 中的修复

标签: javajson

解决方案


我不确定JSON您使用的是哪个库,这里有一种方法Jackson可以实现您想要的。

首先,创建一个Data只有一个成员的类 -Map<String, List<Object>>对于它的 setter,用@JsonAnySetter. 然后实现自定义的setter如下:

类数据

class Data {
    private Map<String, List<Object>> map = new HashMap<>();
    public Map<String, List<Object>> getMap() {
        return map;
    }
    
    @JsonAnySetter
    public void setMap(String key, List<Object> value) {
        if (map.containsKey(key)) {
            map.get(key).add(value.get(0));
        } else {
            map.put(key, Stream.of(value.get(0)).collect(Collectors.toList()));
        }
    }
}

代码片段
Data准备好后,您可以使用重复键反序列化给定的 JSON 字符串,Data并通过以下代码片段将其序列化为预期的 JSON 字符串。

ObjectMapper mapper = new ObjectMapper();
Data data = mapper.readValue(jsonStr, Data.class);
         
System.out.println(mapper.writerWithDefaultPrettyPrinter()
        .writeValueAsString(data.getMap()));

控制台输出

{
  "data" : [ {
    "location" : "hjjh",
    "latitude" : "56.65765",
    "longitude" : "65.6576"
  }, {
    "location" : "thfh",
    "latitude" : "67.65765",
    "longitude" : "5.6576"
  } ]
}

推荐阅读