2016-03-02 792 views
3

如果我们已经给出了2个json类型的字符串,我们如何将它们合并成单个json在java中的字符串?如何在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" 
     } 
} 
+0

没有内置的功能。取2个节点,遍历节点a的子节点,看它们是否也存在于节点b中。如果是这样,递归合并它们。然后遍历节点b的其余节点。这给你一个合并的节点c。 – f1sh

+2

“title”将被重新修改的条件是什么? –

+0

您应该通过将JSON转换为Glossary对象并在复制方法中应用想要写入的规则来手动执行此操作。这将是更安全,更清洁的方式。 – agilob

回答

1

这是递归合并两个jsons的代码。该输出如例外:

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; 
    } 
6

下面的代码应该这样做,有几个假设:

  • 您正在使用杰克逊库(com.fasterxml.jackson.databind.ObjectMapper)的ObjectMapper以连载/ deserialise 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)); 
    
+0

但这不是例外的结果。这是产生:{“词汇表”:{“标题”:“示例词汇表”,“GlossDiv”:{“标题”:“S”}}}' –

+0

我会写我自己的java代码,由@agilob提供 –