如何在java中将两个json字符串合并为一个

如何在java中将两个json字符串合并为一个,java,json,Java,Json,如果我们已经给出了2个json类型的字符串,我们如何在java中将它们合并成单个json字符串 e.g. String json1 = { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S" } } } String json2 = {

如果我们已经给出了2个json类型的字符串,我们如何在java中将它们合并成单个json字符串

e.g. 

    String json1 = {
        "glossary": {
            "title": "example glossary",
            "GlossDiv": {
                "title": "S"
            }
        }
    }

String json2 = {
        "glossary": {
            "title": "person name",
            "age":  "25"
        }
    }  
应该产生

String mergedJson = {
   "glossary": {
            "title": "example glossary",
            "GlossDiv": {
                "title": "S"
            },
            "age":  "25"
        }
}

下面的代码应该可以做到这一点,但有几个假设:

  • 您正在使用Jackson库的ObjectMapper(
    com.fasterxml.Jackson.databind.ObjectMapper
    )来序列化/反序列化json
  • 合并时,json1的字段将始终覆盖json2

    ObjectMapper mapper = new ObjectMapper();
    Map<String, Object> map1 = mapper.readValue("json1", Map.class);
    Map<String, Object> map2 = mapper.readValue("json2", Map.class);
    Map<String, Object> merged = new HashMap<String, Object>(map2);
    merged.putAll(map1);
    System.out.println(mapper.writeValueAsString(merged));
    
    ObjectMapper mapper=new ObjectMapper();
    Map map1=mapper.readValue(“json1”,Map.class);
    Map map2=mapper.readValue(“json2”,Map.class);
    Map merged=新的HashMap(map2);
    合并。putAll(map1);
    System.out.println(mapper.writeValueAsString(合并));
    

    • 下面是递归合并两个JSON的代码。除此之外,这将输出:

      private static JsonObject merge(JsonObject json1Obj, JsonObject json2Obj) {
      
              Set<Entry<String, JsonElement>> entrySet1 = json1Obj.entrySet();
              for (Entry<String, JsonElement> entry : entrySet1) {
                  String key1 = entry.getKey();
                  if (json2Obj.get(key1) != null) {
                      JsonElement tempEle2 = json2Obj.get(key1);
                      JsonElement tempEle1 = entry.getValue();
                      if (tempEle2.isJsonObject() && tempEle1.isJsonObject()) {
                          JsonObject mergedObj = merge(tempEle1.getAsJsonObject(),
                                  tempEle2.getAsJsonObject());
                          entry.setValue(mergedObj);
                      }
                  }
              }
      
              Set<Entry<String, JsonElement>> entrySet2 = json2Obj.entrySet();
              for (Entry<String, JsonElement> entry : entrySet2) {
                  String key2 = entry.getKey();
                  if (json1Obj.get(key2) == null) {
                      json1Obj.add(key2, entry.getValue());
                  }
              }
              return json1Obj;
          }
      
      私有静态JsonObject合并(JsonObject JSON1Object、JsonObject JSON2Object){
      Set entrySet1=json1Obj.entrySet();
      for(条目:entrySet1){
      字符串key1=entry.getKey();
      if(json2Obj.get(key1)!=null){
      JsonElement tempEle2=json2Obj.get(键1);
      JsonElement tempEle1=entry.getValue();
      if(tempEle2.isJsonObject()和&tempEle1.isJsonObject()){
      JsonObject mergedObj=merge(tempEle1.getAsJsonObject(),
      tempEle2.getAsJsonObject());
      entry.setValue(mergedObj);
      }
      }
      }
      Set entrySet2=json2Obj.entrySet();
      for(条目:entrySet2){
      字符串key2=entry.getKey();
      if(json1Obj.get(key2)==null){
      json1Obj.add(key2,entry.getValue());
      }
      }
      返回json1Obj;
      }
      
      所以我来晚了,但如果有人无意中发现了这个问题,我想与大家分享我的解决方案。 您可以使用
      com.fasterxml.jackson.core:jackson-databind
      ObjectMapper.readerforupdatening()
      深入合并两个json字符串

      在此场景中,您将两个Json作为字符串传递,并通过ReaderForUpdate(未测试的代码)将它们合并:

      我使用类似的代码将属性合并到现有数据集中。在本例中,
      SomeProperties
      类包含一个hashmap,它保存特定用户的属性。传入的
      propertiesString
      是单点分隔的属性,例如
      some.random.property=value
      。属性将通过
      com.fasterxml.jackson.dataformat:jackson-dataformat属性转换为
      JsonNode

      public SomeProperties mergeProperties(SomeProperties someProperties, String propertiesString) {
          JavaPropsMapper javaPropsMapper = new JavaPropsMapper();
          ObjectMapper objectMapper = new ObjectMapper();
          JsonNode jsonNode = javaPropsMapper.readTree(propertiesString);
          ObjectReader objectReader = mapper.readerForUpdating(someProperties.getProperties());
          HashMap<String, Object> mergedProperties = objectReader.readValue(jsonNode);
          someProperties.setProperties(mergedProperties);
          return someProperties;
      }
      
      public SomeProperties合并属性(SomeProperties SomeProperties,String properties String){
      JavaPropsMapper JavaPropsMapper=新的JavaPropsMapper();
      ObjectMapper ObjectMapper=新的ObjectMapper();
      JsonNode-JsonNode=javaPropsMapper.readTree(propertiesString);
      ObjectReader=mapper.reader用于更新(someProperties.getProperties());
      HashMap mergedProperties=objectReader.readValue(jsonNode);
      setProperties(合并属性);
      返回一些属性;
      }
      

      在这两种情况下,传递到
      objectReader.readValue()
      的所有内容都将覆盖现有键。

      没有内置的功能。取2个节点,在节点a的子节点上循环,看看它们是否也存在于节点b中。如果是,则递归合并它们。然后在节点b的其余节点上循环。这将为您提供一个合并的节点c。重新绘制
      title
      的条件是什么?您应该手动将JSON转换为术语表对象,并在您将编写的复制方法中应用所需的规则。这样做会更安全、更干净,但这也不例外。这将产生:
      {“glossary”:{“title”:“example glossary”,“GlossDiv”:{“title”:“S”}}
      我将编写自己的java代码,按照@agilob的指示手动执行
      public SomeProperties mergeProperties(SomeProperties someProperties, String propertiesString) {
          JavaPropsMapper javaPropsMapper = new JavaPropsMapper();
          ObjectMapper objectMapper = new ObjectMapper();
          JsonNode jsonNode = javaPropsMapper.readTree(propertiesString);
          ObjectReader objectReader = mapper.readerForUpdating(someProperties.getProperties());
          HashMap<String, Object> mergedProperties = objectReader.readValue(jsonNode);
          someProperties.setProperties(mergedProperties);
          return someProperties;
      }