簡體   English   中英

如何合並兩個 JSON 字符串

[英]How to merge two JSON string

我有兩個 JSON 字符串,我想將這兩個響應字符串合並為一個。 有沒有辦法使用 java 合並這兩個 JSON 字符串?

String str1 = "{
                "data" : { 
                        "values" : {
                            "name" : "kiran",
                            "age"  : "24"
                        }
                        }
                        }"
                        
String str2 = "{
                "data" : { 
                        "values" : {
                            "name" : "Mamu",
                            "age"  : "26"
                        }
                        }
                        }"

我想合並這兩個 JSON 字符串如下

String mergeResult = "{
                "data" : { 
                        "values" : [
                        {
                            "name" : "kiran",
                            "age"  : "24"
                        },
                        {
                            "name" : "Manu",
                            "age"  : "26"
                        }
                        ]
                        }
                        }"

從您的示例 JSON 看來,輸入對象可能多於兩個,因此我將通過 JOLT 庫( https://github.com/bazaarvoice/jolt )使用 JSON 到 JSON 的轉換,如下所示:

  1. 形成所有輸入{"data" : ...}對象的 JSON 數組(通過收集原始對象並在序列化之前將它們放入List中,或者通過用方括號將它們的 JSON 手動連接):
[
  {
    "data": {
      "values": {
        "name": "kiran",
        "age": "24"
      }
    }
  },
  {
    "data": {
      "values": {
        "name": "Mamu",
        "age": "26"
      }
    }
  }
]
  1. 使用 JOLT 規范:
[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "data": {
          "values": {
            "@": "data.values[]"
          }
        }
      }
    }
  }
]

生成的 JSON:

{
  "data" : {
    "values" : [ {
      "name" : "kiran",
      "age" : "24"
    }, {
      "name" : "Mamu",
      "age" : "26"
    } ]
  }
}

在您的應用程序中使用它之前,您可以在http://jolt-demo.appspot.com上自己測試或修改規范。

下面是 Java 端的樣子:

Resource transformationSpec = ...
String inputJson = ...
List<Object> specs = JsonUtils.jsonToList(transformationSpec.getInputStream());
Chainr chainr = Chainr.fromSpec(specs);
Object inputObject = JsonUtils.jsonToObject(inputJson);
Object transformedObject = chainr.transform(inputObject);
String transformedJson = JsonUtils.toJsonString(transformedObject);

可能不是最有效的解決方案,但非常簡單的解決方案是將每個字符串解析為映射(或特定的 POJO,如果有的話)並將它們合並為映射,然后序列化回 Json 字符串。 要將 json 字符串解析為映射或特定 POJO,您可以使用 Jackson 庫 - ObjectMapperGson庫的方法 readValue()。 此外,我在 Jackson 庫上編寫了自己的簡單包裝器,以簡化使用。 JsonUtils類作為 MgntUtils 庫的一部分提供(由我編寫和維護)。 此類僅具有允許您從/到類實例的 Json String 解析和反序列化的方法。 所以你的代碼可能如下:

public String mergeJsonStrings(String str1, Str2) throws IOException {
  Map<String, Object> map1 = convertJsonStringToMap(str1);
  Map<String, Object> map2 = convertJsonStringToMap(str2);
  Map<String, Object> dataMap1 = (Map<String, Object>)map1.get("data");
  Map<String, Object> valuesMap1 = (Map<String, Object>)dataMap1.get("values");
  Map<String, Object> dataMap2 = (Map<String, Object>)map2.get("data");
  Map<String, Object> valuesMap2 = (Map<String, Object>)dataMap2.get("values");
  valuesMap1.putAll(valuesMap2);
  return convertMapToJsonString(map1);
}


  Map<String, Object> convertJsonStringToMap(String str) throws IOException {
    return JsonUtils.readObjectFromJsonString(str, Map.class);
  }

  Strong convertMapToJsonString(Map<String,Object> map) throws JsonProcessingException{
    return JsonUtils.writeObjectToJsonString(map); 
  }

此示例使用 MgntUtils 庫來解析和序列化 JSON,但當然您可以使用 Jackson、Gson 或任何其他您想要的庫。 MgntUtils 庫可作為Maven 工件和在Github上使用(包括源代碼和 Javadoc)

圖書館Josson & Jossons具有連接操作來組合數據集中的數組。

https://github.com/octomix/josson

Jossons jossons = new Jossons();
jossons.putDataset("resp1", Josson.fromJsonString(
    "{" +
    "    \"data\": {" +
    "        \"values\": {" +
    "            \"name\": \"kiran\"," +
    "            \"age\": \"24\"" +
    "        }" +
    "    }" +
    "}"));
jossons.putDataset("resp2", Josson.fromJsonString(
    "{" +
    "    \"data\": {" +
    "        \"values\": {" +
    "            \"name\": \"Mamu\"," +
    "            \"age\": \"26\"" +
    "        }" +
    "    }" +
    "}"));
    
JsonNode mergeValues = jossons.evaluateQuery(
    "resp1->data.toArray() <+< resp2->data.toArray()");
System.out.println(mergeValues.toPrettyString());

JsonNode mergeResult = Josson.create(mergeValues).getNode(
    "toObject('values').toObject('data')");
System.out.println(mergeResult.toPrettyString());

合並值

[ {
  "name" : "kiran",
  "age" : "24"
}, {
  "name" : "Mamu",
  "age" : "26"
} ]

合並結果

{
  "data" : {
    "values" : [ {
      "name" : "kiran",
      "age" : "24"
    }, {
      "name" : "Mamu",
      "age" : "26"
    } ]
  }
}

暫無
暫無

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

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