You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在指定层级将JSON对象合并到主JSON对象中?

Java实现指定路径深度的JSON合并方案

需求明确

主JSON结构:

{"data":{"barrel":{"length":100,"stage":[0,1,2]},"a":100,"b":200}}

需要将新JSON对象 {"width":100} 合并到路径 data.barrel 下,最终输出包含新增字段的完整主JSON结构。此前使用JSONObject、Josson等工具仅能修改子对象,无法同步更新主JSON,以下是适配任意路径深度的通用解决方案。

依赖准备

使用Jackson库实现JSON解析与修改,Maven依赖如下:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 建议使用最新稳定版本 -->
</dependency>

通用实现代码

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class JsonMergeUtil {
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    /**
     * 将指定JSON合并到主JSON的指定路径下
     * @param mainJsonStr 主JSON字符串
     * @param targetPath 目标路径,格式如"data.barrel"
     * @param mergeJsonStr 要合并的JSON字符串
     * @return 合并后的完整JSON字符串
     * @throws Exception 解析或修改JSON时的异常
     */
    public static String mergeJsonAtPath(String mainJsonStr, String targetPath, String mergeJsonStr) throws Exception {
        // 解析主JSON与待合并JSON
        JsonNode mainNode = OBJECT_MAPPER.readTree(mainJsonStr);
        JsonNode mergeNode = OBJECT_MAPPER.readTree(mergeJsonStr);

        // 拆分路径节点
        String[] pathSegments = targetPath.split("\\.");
        JsonNode currentNode = mainNode;

        // 遍历路径定位到目标节点的父级节点
        for (int i = 0; i < pathSegments.length - 1; i++) {
            currentNode = currentNode.get(pathSegments[i]);
            if (currentNode == null || !currentNode.isObject()) {
                throw new IllegalArgumentException("目标路径不存在或对应节点不是对象类型");
            }
        }

        // 获取目标节点并校验类型
        ObjectNode targetNode = (ObjectNode) currentNode.get(pathSegments[pathSegments.length - 1]);
        if (targetNode == null) {
            throw new IllegalArgumentException("目标路径末尾节点不存在");
        }

        // 合并字段:默认覆盖已有字段,若需保留原字段可修改此逻辑
        targetNode.setAll((ObjectNode) mergeNode);

        // 转换回JSON字符串返回
        return OBJECT_MAPPER.writeValueAsString(mainNode);
    }

    // 测试示例
    public static void main(String[] args) throws Exception {
        String mainJson = "{\"data\":{\"barrel\":{\"length\":100,\"stage\":[0,1,2]},\"a\":100,\"b\":200}}";
        String mergeJson = "{\"width\":100}";
        String targetPath = "data.barrel";

        String mergedJson = mergeJsonAtPath(mainJson, targetPath, mergeJson);
        System.out.println(mergedJson);
        // 输出结果:{"data":{"barrel":{"length":100,"stage":[0,1,2],"width":100},"a":100,"b":200}}
    }
}

可选调整:保留原字段不被覆盖

如果不需要覆盖目标路径下已存在的字段,仅添加新字段,可将合并逻辑替换为:

mergeNode.fields().forEachRemaining(entry -> {
    if (!targetNode.has(entry.getKey())) {
        targetNode.set(entry.getKey(), entry.getValue());
    }
});

方案优势

  • 支持任意层级深度的路径定位,只要路径对应节点为Object类型即可
  • 基于Jackson的树形节点结构,修改子节点会直接同步到整个主JSON对象,避免仅修改子对象但主对象未更新的问题
  • 逻辑清晰,可根据需求调整合并规则(覆盖/新增)

内容的提问来源于stack exchange,提问作者Pranav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:47:51