使用 Jackson 合并两个 JSON 文档

2022-08-31 19:41:23

是否可以将两个 JSON 文档与 Jackson JSON 库合并?我基本上是在简单的Java Maps上使用Jackson映射器。

我试图在谷歌和杰克逊的文档中搜索,但找不到任何东西。


答案 1

受StaxMans答案的启发,我实现了这种合并方法。

public static JsonNode merge(JsonNode mainNode, JsonNode updateNode) {

    Iterator<String> fieldNames = updateNode.fieldNames();
    while (fieldNames.hasNext()) {

        String fieldName = fieldNames.next();
        JsonNode jsonNode = mainNode.get(fieldName);
        // if field exists and is an embedded object
        if (jsonNode != null && jsonNode.isObject()) {
            merge(jsonNode, updateNode.get(fieldName));
        }
        else {
            if (mainNode instanceof ObjectNode) {
                // Overwrite field
                JsonNode value = updateNode.get(fieldName);
                ((ObjectNode) mainNode).put(fieldName, value);
            }
        }

    }

    return mainNode;
}

希望这有助于某人。


答案 2

一种方法是像这样使用:ObjectReader

MyBean defaults = objectMapper.readValue(defaultJson, MyBean.class);
ObjectReader updater = objectMapper.readerForUpdating(defaults);
MyBean merged = updater.readValue(overridesJson);

这将合并来自两个来源的数据。这只会形成一个浅层副本,即不对包含的对象进行递归合并。

否则,您可能只需要将JSON读取为树(),循环访问内容并手动合并。无论如何,这通常是有道理的,因为合并的规则不是微不足道的,每个人都对合并应该如何工作有自己的想法。JsonNode

编辑: (03-四月-2017)

根据@Fernando Correia的评论,实际上在即将推出的Jackson 2.9(将于2017年4月或5月发布)中添加了一项新功能,最终允许深度合并。