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

f45qwnt8  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(177)

我有两个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>>(){});,但遇到未知属性异常。
1.我尝试了JsonNode node = objectMapper.readTree(jsonOneString);,但无法进一步使用此方法。
我知道我在这里所做的是非常低效的,所以寻找方法,将使用没有实体类,最小的新对象创建和最小的循环。
更新:我更新了下面的代码,做了一点小小的修改:

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

    //
}
nfzehxib

nfzehxib1#

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());

相关问题