簡體   English   中英

如何在 java 中將兩個 json 字符串合並為一個

[英]How to merge two json Strings into one in java

如果我們給出了 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));

這是遞歸合並兩個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;
    }

所以我參加聚會已經很晚了,但如果有人偶然發現這個問題,我想分享我的解決方案。 您可以使用com.fasterxml.jackson.core:jackson-databind ObjectMapper.readerForUpdating()深度合並兩個 json 字符串。

在這種情況下,您將兩個 Json 作為字符串傳遞並通過 readerForUpdating(未經測試的代碼)合並它們:

public String mergeJsonStrings(String json1, String json2) {
    ObjectMapper mapper = new ObjectMapper();
    ObjectReader reader = mapper.readerForUpdating(json1);
    String result = reader.readValue(json2);
    return result;
}

我使用類似的代碼將屬性合並到現有數據集中。 在此示例中, SomeProperties類包含一個哈希圖,其中包含特定用戶的屬性。 傳入的propertiesString是一個單點分隔的屬性,例如some.random.property=value 該屬性將被轉換成一個JsonNodecom.fasterxml.jackson.dataformat:jackson-dataformat-properties

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

在這兩種情況下,傳遞給objectReader.readValue()所有內容都將覆蓋現有的鍵。

考慮使用為您完成這項工作的庫,例如JSON Merge ,可在 Maven Central 獲得。

您將通過一行代碼獲得所需的結果(如果您之前已經加載了 JSONObjects,您可以忽略字符串聲明):

String json1 = "{\n"
        + "        \"glossary\": {\n"
        + "            \"title\": \"example glossary\",\n"
        + "            \"GlossDiv\": {\n"
        + "                \"title\": \"S\"\n"
        + "            }\n"
        + "        }\n"
        + "    }";

String json2 = "{\n"
        + "        \"glossary\": {\n"
        + "            \"title\": \"person name\",\n"
        + "            \"age\":  \"25\"\n"
        + "        }\n"
        + "    }";

JSONObject result = new JsonMerger<>(JSONObject.class).merge(json2, json1);

注意:如果發生鍵沖突,傳遞給merge方法的第一個 JSON 參數將始終比第二個參數具有更高的優先級/重要性。

該庫也適用於 Jackson、Gson 和其他 JSON 提供程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM