[英]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.