如何基于公共键高效合并两个 JSON 字符串

问题描述 投票:0回答:2

我有两个 JSON 字符串,它们本质上是 JSONObject 的数组。这两个 JSON 字符串具有以下结构和键:

JSON-1:

[
    {
        "title": "ABC",
        "edition": 7,
        "year": 2011
    },
    {
        "title": "DEF",
        "edition": 2,
        "year": 2012
    },
    {
        "title": "XYZ",
        "edition": 3,
        "year": 2013
    }
]

并且,JSON-2:

[
    {
        "title": "ABC",
        "price": "20"
    },
    {
        "title": "DEF",
        "price": "20"
    },
    {
        "title": "XYZ",
        "price": "20"
    }
]

这两个 JSON 都有一个公共键

"title"
基于此我想合并这两个 JSON,要么将 JSON-2 值合并到 JSON-1 中,要么使用合并结果创建一个 JSON 对象。

合并结果应如下所示:

[
    {
        "title": "ABC",
        "edition": 7,
        "year": 2011,
        "price": "20"
    },
    {
        "title": "DEF",
        "edition": 2,
        "year": 2012
        "price": "20"
    },
    {
        "title": "XYZ",
        "edition": 3,
        "year": 2013
        "price": "20"
    }
]

如何通过最少的循环和最少的对象创建来实现这一点?我也无法使用实体/模型类。我们的想法是在不创建任何模型类的情况下完成此操作。

注意:我无法使用 Gson,因为我没有获得使用它的批准。

  1. 我尝试使用

    List<JSONObject> listObj = objectMapper.readValue(jsonOneString, new TypeReference<List<JSONObject>>(){});
    , 但我收到了未知属性异常。

  2. 我尝试了

    JsonNode node = objectMapper.readTree(jsonOneString);
    ,但我无法继续使用这种方法。

我知道我在这里所做的事情效率非常低,因此寻找不使用实体类、最少新对象创建和最少循环的方法。请指教。

更新:我更新了以下代码并稍加修改:

if (json1elem.get("title")!=null 
        && json2elem.get("title")!=null 
            && json1elem.get("title").equals(json2elem.get("title"))) {

    //
}
java json jackson objectmapper jsonnode
2个回答
0
投票
JsonNode json1 = objectMapper.readTree(jsonOneString);
JsonNode json2 = objectMapper.readTree(jsonTwoString);
for (JsonNode json1elem : json1) {
    for (JsonNode json2elem : json2) {
        if (json1elem.get("title").equals(json2elem.get("title"))) {
            ((ObjectNode) json1elem).setAll((ObjectNode) json2elem);
            break;
        }
    }
}
System.out.println(json1.toPrettyString());

0
投票
public static JSONObject deepMerge(JSONObject source, JSONObject target) throws JSONException {
        Iterator it = source.keys();
        while (it.hasNext()) {
            String key = (String) it.next();
            Object value = source.get(key);
            if (!target.has(key)) {
                target.put(key, value);
            } else {
                if (value instanceof JSONArray) {
                    JSONArray valueArry = (JSONArray) value;
                    for (int i = 0; i < valueArry.length(); i++) {
                        if (valueArry.get(i) instanceof JSONObject) {
                            JSONObject jsonObj = (JSONObject) valueArry.get(i);
                            JSONObject valueJson1 = (JSONObject) jsonObj;
                            JSONArray targetArray = target.getJSONArray(key);
                            deepMerge(valueJson1, targetArray.getJSONObject(i));
                        }
                    }
                } else if (value instanceof JSONObject) {
                    JSONObject valueJson = (JSONObject) value;
                    deepMerge(valueJson, target.getJSONObject(key));
                } else {
                    target.put(key, value);
                }
            }
        }
        return target;
    }
© www.soinside.com 2019 - 2024. All rights reserved.