Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将两个JSON合并到JSONObject而不是JSONArray_Java_Json - Fatal编程技术网

Java 将两个JSON合并到JSONObject而不是JSONArray

Java 将两个JSON合并到JSONObject而不是JSONArray,java,json,Java,Json,我需要找到一种方法,在没有JSON数组的情况下,如何将两个(或更多)JSON对象合并成一个JSON对象 下面是一个代码示例: public static void mergeJSONs() { JSONObject jsonObject1 = new JSONObject("{\"1level1\":{\"1level2\":{\"1label1\":\"1value1\"}}}");

我需要找到一种方法,在没有JSON数组的情况下,如何将两个(或更多)JSON对象合并成一个JSON对象

下面是一个代码示例:

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;
}

参考:

我更喜欢并推荐使用谷歌Gson

最后一个版本是从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;
}

参考:

谢谢,它很有效!现在唯一的事情是找到一种方法来正确地排序这个json,但这与这个问题无关,所以我会自己找到方法。再来一次,谢谢!Sort json:谢谢,它很有效!现在唯一的事情是找到一种方法来正确地排序这个json,但这与这个问题无关,所以我会自己找到方法。再来一次,谢谢!排序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);
}
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;
}