当前位置: 首页 > news >正文

Jackson实现JSON数据的合并

 JSON数据的操作,系列文章:

《Jackson的核心类与API方法:ObjectMapper、JsonNode、ObjectNode、ArrayNode》

《Jackson的使用与创建Jackson工具类》

《Jackson使用ObjectNode对象实现JSON对象数据(一):增、删、改、查》

《Jackson使用ArrayNode对象实现JSON列表数据(二):增、删、改、查》

《Jackson实现JSON数据的合并》

Jackson 库实现 JSON 数据的合并,可以采用基于树模型的深度合并(递归策略),可以保留两个 JSON 的所有层级数据,避免覆盖冲突。在实际开发中,Jackson 功能丰富、安全可靠并且具有比较好的兼容性,这让程序开发人员可以很方便地实现 JavaBean 和以 “键 : 值” 结构保存的 JSON 数据的相互转换。

1、创建 Jackson 工具类

创建 JacksonUtil 类(Jackson工具类),实现JSON数据的合并方法。

package com.pjb.utils;

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

/**
 * Jackson工具类
 * @author pan_junbiao
 **/
public class JacksonUtil
{
    private static ObjectMapper mapper = new ObjectMapper();

    /**
     * 合并 JSON 数据
     * @return 合并后的 JsonNode 对象
     */
    public static JsonNode mergeJsonNode(JsonNode mainNode, JsonNode updateNode)
    {
        //参数校验
        if (mainNode == null && updateNode == null)
        {
            return null;
        }

        if (mainNode == null)
        {
            return updateNode;
        }

        if (updateNode == null)
        {
            return mainNode;
        }

        if (mainNode.isObject() && updateNode.isObject())
        {
            ObjectNode mergedNode = (ObjectNode) mainNode;
            updateNode.fields().forEachRemaining(entry -> {
                String key = entry.getKey();
                JsonNode value = entry.getValue();
                if (mergedNode.has(key))
                {
                    mergedNode.set(key, mergeJsonNode(mergedNode.get(key), value));
                } else
                {
                    mergedNode.set(key, value);
                }
            });
            return mergedNode;
        } else
        {
            // 非对象类型直接覆盖(如数组、基本类型)
            return updateNode;
        }
    }

    /**
     * 合并 JSON 数据
     * @return 合并后的 JSON 字符串
     */
    public static String mergeJsonString(String mainJson, String updateJson)
    {
        //参数校验
        if ((mainJson == null || mainJson.length() == 0) && (updateJson == null || updateJson.length() == 0))
        {
            return null;
        }

        if (mainJson == null || mainJson.length() == 0)
        {
            return updateJson;
        }

        if (updateJson == null || updateJson.length() == 0)
        {
            return mainJson;
        }

        try
        {
            //合并 JSON 数据
            JsonNode mainNode = mapper.readTree(mainJson);
            JsonNode updateNode = mapper.readTree(updateJson);
            JsonNode resultNode = mergeJsonNode(mainNode, updateNode);
            return mapper.writeValueAsString(resultNode);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }
}

2、测试 JSON 数据的合并

创建测试方法,测试 JSON 数据的合并结果。

/**
 * 合并 JSON 数据
 */
@Test
public void mergeJsonTest()
{
    try
    {
        String mainNode = "{\n" +
                "  \"userId\": 1,\n" +
                "  \"userName\": \"pan_junbiao的博客\"\n" +
                "}";

        String updateNode = "{\n" +
                "  \"userName\": \"pan_junbiao的博客_001\",\n" +
                "  \"blogName\": \"您好,欢迎访问 pan_junbiao的博客\",\n" +
                "  \"blogUrl\": \"https://blog.csdn.net/pan_junbiao\",\n" +
                "  \"hobbies\": [\"游泳\", \"篮球\", \"足球\"]\n" +
                "}";

        //合并 JSON 数据
        String result = JacksonUtil.mergeJsonString(mainNode, updateNode);

        //打印结果
        System.out.println(result);
    } catch (Exception ex)
    {
        ex.printStackTrace();
    }
}

执行结果:

{
  "userId": 1,
  "userName": "pan_junbiao的博客_001",
  "blogName": "您好,欢迎访问 pan_junbiao的博客",
  "blogUrl": "https://blog.csdn.net/pan_junbiao",
  "hobbies": ["游泳", "篮球", "足球"]
}

相关文章:

  • python如何提取html中所有的图片链接
  • 第44章:外部配置中心与Kubernetes集成
  • 深入解析 Socket:网络通信的桥梁
  • LangChain组件Tools/Toolkits详解(6)——特殊类型注解Annotations
  • 删除重复数据,防止删除所有数据
  • 在 Ubuntu 下通过 Docker 部署 Mastodon 服务器的详细教程
  • 循环不变量原则——螺旋矩阵
  • 基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)
  • 综合章节:游戏网络化、模组化与深度扩展
  • Mysql深分页的解决方案
  • 再次理解 Spring 中的 IOC、DI、AOP 与多态
  • 【CF】Day14——Codeforces Round(Div2) 924 BC + 926 C + 934 C + 922 C
  • k8s的控制应用Helm
  • 【学习笔记】LLM推理与部署
  • Spring6:10 数据校验-Validation
  • 基于SpringBoot+Vue的在线拍卖管理系统+LW示例参考
  • JavaScript 赋值运算符
  • windows剪切板的内容无法拷贝到虚拟机virtualbox里的Rocky Linux中 --Draft
  • Unity图形学Shader快速回顾
  • C++ Json-Rpc框架-2框架(服务端模块 客户端模块 框架设计)
  • 南方地区强降雨或致部分河流发生超警洪水,水利部部署防范
  • “两高”出台司法解释,严打破坏黑土地资源犯罪
  • 五一小长假上海“人从众”,全要素旅游交易总额超200亿元
  • 浙江医生举报3岁男童疑遭生父虐待,妇联:已跟爷爷奶奶回家
  • 保持高位运行,今天全国铁路预计发送旅客1800万人次
  • 网红“丢那猩”丢石块闯祸,起哄游客难逃责任