Java 将两个JSON合并到JSONObject而不是JSONArray
我需要找到一种方法,在没有JSON数组的情况下,如何将两个(或更多)JSON对象合并成一个JSON对象 下面是一个代码示例:Java 将两个JSON合并到JSONObject而不是JSONArray,java,json,Java,Json,我需要找到一种方法,在没有JSON数组的情况下,如何将两个(或更多)JSON对象合并成一个JSON对象 下面是一个代码示例: public static void mergeJSONs() { JSONObject jsonObject1 = new JSONObject("{\"1level1\":{\"1level2\":{\"1label1\":\"1value1\"}}}");
public static void mergeJSONs() {
JSONObject jsonObject1 = new JSONObject("{\"1level1\":{\"1level2\":{\"1label1\":\"1value1\"}}}");
JSONObject jsonObject2 = new JSONObject("{\"1level1\":{\"1level2\":{\"1label2\":\"1value2\"}}}");
JSONObject jsonObject3 = new JSONObject("{\"2level1\":{\"2level2\":{\"2level3\":{\"2label1\":\"2value1\"}}}}");
JSONObject jsonObject4 = new JSONObject("{\"2level1\":{\"2level2\":{\"2label2\":\"2value2\"}}}");
JSONObject combined = new JSONObject();
combined.put("strings", jsonObject1);
combined.put("strings", jsonObject2);
combined.put("strings", jsonObject3);
combined.put("strings", jsonObject4);
System.out.println(combined.toString());
}
此代码的输出:
{"strings":{"2level1":{"2level2":{"2label2":"2value2"}}}}
预期产出:
{
"strings":{
"1level1":{
"1level2":{
"1label1":"1value1",
"1label2":"1value2"
}
},
"2level1":{
"2level2":{
"2level3":{
"2label1":"2value1"
},
"2label2":"2value2"
}
}
}
}
或者在一行中:
{"strings":{"1level1":{"1level2":{"1label1":"1value1","1label2":"1value2"}},"2level1":{"2level2":{"2level3":{"2label1":"2value1"},"2label2":"2value2"}}}}
问题是,我永远不会知道JSON对象的名称,以及这个JSON到底有多深,因为它将用于转换文件,所以我无法为此创建POJO
目前,我正在使用org.json库来实现这一点,但如果有一种简单的方法可以在其他库中实现这一点的话,它也适用于我
图书馆:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
org.json
json
20180813
更新#1:
提供这些对象只是为了举例,实际上JSON将更大、更深。问题是,我永远不会知道JSON中的键有多深,哪些键匹配。所以这里需要递归方法,它将遍历两个对象,直到有任何匹配的键,并且其中一个对象不包含该键,然后所有嵌套对象都应该合并到该键
更新#2:
更新了示例代码和预期输出,使图像更清晰我更喜欢并建议使用Gson来自Google: 最后一个版本是从2019年10月开始的2.8.6: 该方法可以接收json有效负载列表,添加根元素并合并:
public String organizeJson(String... jsonList) throws Exception {
JsonObject jsonObj = null;
Gson gson = new GsonBuilder().setPrettyPrinting().create();
for (String json : jsonList) {
if (jsonObj != null) {
jsonObj = jsonMerge(jsonObj, gson.fromJson(json, JsonObject.class));
} else {
jsonObj = gson.fromJson(json, JsonObject.class);
}
}
JsonObject jsonStringsRoot = new JsonObject();
/* Add "strings" as root element */
jsonStringsRoot.add("strings", jsonObj);
return gson.toJson(jsonStringsRoot);
}
方法使用递归调用查找嵌套对象的最后一级(深度合并):
publicstaticjsonobjectjsonmerge(jsonobjectjsona,jsonobjectjsonb)抛出异常{
对于(Map.Entry sourceEntry:jsonA.entrySet()){
String key=sourceEntry.getKey();
JsonElement value=sourceEntry.getValue();
如果(!jsonB.has(key)){
如果(!value.isJsonNull()){
jsonB.add(key,value);
}
}否则{
如果(!value.isJsonNull()){
if(value.isJsonObject()){
jsonMerge(value.getAsJsonObject(),jsonB.get(key.getAsJsonObject());
}否则{
jsonB.add(key,value);
}
}否则{
jsonB.remove(键);
}
}
}
返回jsonB;
}
参考:
public String organizeJson(String... jsonList) throws Exception {
JsonObject jsonObj = null;
Gson gson = new GsonBuilder().setPrettyPrinting().create();
for (String json : jsonList) {
if (jsonObj != null) {
jsonObj = jsonMerge(jsonObj, gson.fromJson(json, JsonObject.class));
} else {
jsonObj = gson.fromJson(json, JsonObject.class);
}
}
JsonObject jsonStringsRoot = new JsonObject();
/* Add "strings" as root element */
jsonStringsRoot.add("strings", jsonObj);
return gson.toJson(jsonStringsRoot);
}
方法使用递归调用查找嵌套对象的最后一级(深度合并):
publicstaticjsonobjectjsonmerge(jsonobjectjsona,jsonobjectjsonb)抛出异常{
对于(Map.Entry sourceEntry:jsonA.entrySet()){
String key=sourceEntry.getKey();
JsonElement value=sourceEntry.getValue();
如果(!jsonB.has(key)){
如果(!value.isJsonNull()){
jsonB.add(key,value);
}
}否则{
如果(!value.isJsonNull()){
if(value.isJsonObject()){
jsonMerge(value.getAsJsonObject(),jsonB.get(key.getAsJsonObject());
}否则{
jsonB.add(key,value);
}
}否则{
jsonB.remove(键);
}
}
}
返回jsonB;
}
参考:
public String organizeJson(String... jsonList) throws Exception {
JsonObject jsonObj = null;
Gson gson = new GsonBuilder().setPrettyPrinting().create();
for (String json : jsonList) {
if (jsonObj != null) {
jsonObj = jsonMerge(jsonObj, gson.fromJson(json, JsonObject.class));
} else {
jsonObj = gson.fromJson(json, JsonObject.class);
}
}
JsonObject jsonStringsRoot = new JsonObject();
/* Add "strings" as root element */
jsonStringsRoot.add("strings", jsonObj);
return gson.toJson(jsonStringsRoot);
}
public static JsonObject jsonMerge(JsonObject jsonA, JsonObject jsonB) throws Exception {
for (Map.Entry<String, JsonElement> sourceEntry : jsonA.entrySet()) {
String key = sourceEntry.getKey();
JsonElement value = sourceEntry.getValue();
if (!jsonB.has(key)) {
if (!value.isJsonNull()) {
jsonB.add(key, value);
}
} else {
if (!value.isJsonNull()) {
if (value.isJsonObject()) {
jsonMerge(value.getAsJsonObject(), jsonB.get(key).getAsJsonObject());
} else {
jsonB.add(key, value);
}
} else {
jsonB.remove(key);
}
}
}
return jsonB;
}