我有一套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,
}
}
答案 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;
}