[英]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 的轉換,如下所示:
{"data" : ...}
對象的 JSON 數組(通過收集原始對象並在序列化之前將它們放入List
中,或者通過用方括號將它們的 JSON 手動連接):[
{
"data": {
"values": {
"name": "kiran",
"age": "24"
}
}
},
{
"data": {
"values": {
"name": "Mamu",
"age": "26"
}
}
}
]
[
{
"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 庫 - ObjectMapper或Gson庫的方法 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.