利用Jackson实现JSON数据的合并

 更新时间:2025年03月25日 09:32:01   作者:pan_junbiao  
Jackson的功能丰富,安全可靠并且具有比较好的兼容性,这让程序开发人员可以很方便地实现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": ["游泳", "篮球", "足球"]
}

到此这篇关于利用Jackson实现JSON数据的合并的文章就介绍到这了,更多相关Jackson JSON数据合并内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入浅析hbase的优点

    深入浅析hbase的优点

    本文讲述了HBase的特征和它的优点,并简要回顾了行键设计的重点之处,它还向你展示了如何在本地配置HBase环境,使用命令创建表、插入数据、检索指定行以及最后如何进行scan操作,感兴趣的朋友一起看看吧
    2017-09-09
  • Spring使用xml方式整合第三方框架流程详解

    Spring使用xml方式整合第三方框架流程详解

    这篇文章主要介绍了Spring使用xml方式整合第三方框架流程,Spring会在应用上下文中为某个bean寻找其依赖的bean,Spring中bean有三种装配机制,分别是:在xml中显式配置、在java中显式配置、隐式的bean发现机制和自动装配
    2023-02-02
  • Spring Boot:Idea从零开始初始化后台项目的教程

    Spring Boot:Idea从零开始初始化后台项目的教程

    这篇文章主要介绍了Spring Boot:Idea从零开始初始化后台项目的教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中避免空指针的几种方法解析

    Java中避免空指针的几种方法解析

    这篇文章主要介绍了Java中避免空指针的几种方法解析,Java 中任何对象都有可能为空,当我们调用空对象的方法时就会抛出 NullPointerException 空指针异常,这是一种非常常见的错误类型,需要的朋友可以参考下
    2023-12-12
  • Sentinel核心类之Entry类解读

    Sentinel核心类之Entry类解读

    这篇文章主要介绍了Sentinel核心类之Entry类解读,Sentinel中Entry可以理解为每次进入资源的一个凭证,如果调用SphO.entry()或者SphU.entry()能获取Entry对象,代表获取了凭证,没有被限流,否则抛出一个BlockException,需要的朋友可以参考下
    2023-12-12
  • 一文搞懂Spring中@Autowired和@Resource的区别

    一文搞懂Spring中@Autowired和@Resource的区别

    @Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同,并且这也是常见的面试题之一,所以我们今天就来盘它
    2022-08-08
  • Java学习笔记:关于Java double类型相加问题

    Java学习笔记:关于Java double类型相加问题

    这篇文章主要介绍了关于Java double类型相加问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java利用反射动态设置对象字段值的实现

    Java利用反射动态设置对象字段值的实现

    桥梁信息维护需要做到字段级别的权限控制,本文主要介绍了Java利用反射动态设置对象字段值的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • SpringSecurity授权机制的实现(AccessDecisionManager与投票决策)

    SpringSecurity授权机制的实现(AccessDecisionManager与投票决策)

    本文主要介绍了SpringSecurity授权机制的实现,其核心是AccessDecisionManager和投票系统,下面就来介绍一下,感兴趣的可以了解一下
    2025-04-04
  • Jackson处理Optional时遇到问题的解决与分析

    Jackson处理Optional时遇到问题的解决与分析

    Optional是Java实现函数式编程的强劲一步,并且帮助在范式中实现,但是Optional的意义显然不止于此,下面这篇文章主要给大家介绍了关于Jackson处理Optional时遇到问题的解决与分析的相关资料,需要的朋友可以参考下
    2022-02-02

最新评论