递归合并JSON结构

时间:2017-02-01 09:11:27

标签: java json

我有一套json字符串。我怎样才能将它们合并到Java中只有一个?

最新的json会在发生冲突时覆盖之前的信息。数组未合并。

实施例

json base:

{
    "plank" : {
        "count" : 2,
        "properties" : {
            "type" : "oak",
            "dimensions" : [5.0, 25, 25]
        }
    }
}

合并:

{
    "plank" : {
        "count" : 4,
        "properties" : {
            "dimensions" : [5.0, 12.5, 25]
        }
    },
    "scrap" : {
        "count" : 1,
    }
}

成为:

{
    "plank" : {
        "count" : 4,
        "properties" : {
            "type" : "oak",
            "dimensions" : [5.0, 12.5, 25]
        }
    },
    "scrap" : {
        "count" : 1,
    }
}

3 个答案:

答案 0 :(得分:3)

我最终做了一个递归合并JSON的方法。

public JSONObject merge(List<JSONObject> objects) {
    for (int i = 0, j = 1; i < objects.size() - 1; i++, j++) {
        merge(objects.get(i), objects.get(j));
    }
    return objects.get(objects.size() - 1);
}


private void merge(JSONObject j1, JSONObject j2) {
    Iterator<String> keys = j1.keys();
    Object obj1, obj2;
    while (keys.hasNext()) {
        String next = keys.next();
        if (j1.isNull(next)) continue;
        obj1 = j1.get(next);
        if (!j2.has(next)) j2.putOpt(next, obj1);
        obj2 = j2.get(next);
        if (obj1 instanceof JSONObject && obj2 instanceof JSONObject) {
            merge((JSONObject) obj1, (JSONObject) obj2);
        }
    }
}

答案 1 :(得分:0)

您可能需要查看Jackson库并首先将JSON字符串转换为映射,然后合并(遍历映射并合并)。

答案 2 :(得分:0)

这对我有用:

public JSONObject merge(Stream<JSONObject> jsonObjectStream) {
    JSONObject finalMerged = new JSONObject();
    finalMerged = jsonObjectStream.reduce(finalMerged, this::merge);

    return finalMerged;
}

private JSONObject merge(JSONObject mergedJson, JSONObject jsonToAdd) {
    Iterator<String> keys = jsonToAdd.keys();
    while (keys.hasNext()) {
        String key = keys.next();
        if (!jsonToAdd.isNull(key)) {
            Object itemToMerge = jsonToAdd.get(key);
            // If target object to merge is another json object, we need to see if our existing object
            // has the same key already set, and if so, they need to be merged.
            if ((itemToMerge instanceof JSONObject) && (mergedJson.opt(key) instanceof JSONObject)) {
                itemToMerge = merge(mergedJson.getJSONObject(key), (JSONObject) itemToMerge);
            }
            mergedJson.putOpt(key, itemToMerge);
        }
    }

    return mergedJson;
}
相关问题