2016-03-02 198 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提供 –