首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Jackson合并两个JSON文档

使用Jackson合并两个JSON文档
EN

Stack Overflow用户
提问于 2012-03-28 02:03:12
回答 6查看 67.2K关注 0票数 49

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

我试着在谷歌和杰克逊的文档中搜索,但什么也找不到。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-03-29 01:08:01

一种方法是像这样使用ObjectReader

代码语言:javascript
运行
复制
MyBean defaults = objectMapper.readValue(defaultJson, MyBean.class);
ObjectReader updater = objectMapper.readerForUpdating(defaults);
MyBean merged = updater.readValue(overridesJson);

它将合并来自两个来源的数据。这只做了一个浅拷贝,也就是说,不会对包含的对象进行递归合并。

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

编辑:(2017年4月3日)

根据@Fernando Correia的评论,实际上在即将到来的杰克逊2.9 (将于2017年4月或5月发布)中添加了一个新的feature,最终允许深度合并。

票数 55
EN

Stack Overflow用户

发布于 2012-07-13 04:19:27

受StaxMans answer的启发,我实现了这个合并方法。

代码语言:javascript
运行
复制
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;
}

希望这对某些人有帮助。

票数 65
EN

Stack Overflow用户

发布于 2015-09-08 08:32:06

受Arn回答的启发。编辑它以添加节点中可能包含节点数组的情况。

代码语言:javascript
运行
复制
public static JsonNode merge(JsonNode mainNode, JsonNode updateNode) {

    Iterator<String> fieldNames = updateNode.fieldNames();

    while (fieldNames.hasNext()) {
        String updatedFieldName = fieldNames.next();
        JsonNode valueToBeUpdated = mainNode.get(updatedFieldName);
        JsonNode updatedValue = updateNode.get(updatedFieldName);

        // If the node is an @ArrayNode
        if (valueToBeUpdated != null && valueToBeUpdated.isArray() && 
            updatedValue.isArray()) {
            // running a loop for all elements of the updated ArrayNode
            for (int i = 0; i < updatedValue.size(); i++) {
                JsonNode updatedChildNode = updatedValue.get(i);
                // Create a new Node in the node that should be updated, if there was no corresponding node in it
                // Use-case - where the updateNode will have a new element in its Array
                if (valueToBeUpdated.size() <= i) {
                    ((ArrayNode) valueToBeUpdated).add(updatedChildNode);
                }
                // getting reference for the node to be updated
                JsonNode childNodeToBeUpdated = valueToBeUpdated.get(i);
                merge(childNodeToBeUpdated, updatedChildNode);
            }
        // if the Node is an @ObjectNode
        } else if (valueToBeUpdated != null && valueToBeUpdated.isObject()) {
            merge(valueToBeUpdated, updatedValue);
        } else {
            if (mainNode instanceof ObjectNode) {
                ((ObjectNode) mainNode).replace(updatedFieldName, updatedValue);
            }
        }
    }
    return mainNode;
}
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9895041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档