繁体   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