利用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数据合并内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot:Idea从零开始初始化后台项目的教程
这篇文章主要介绍了Spring Boot:Idea从零开始初始化后台项目的教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12
一文搞懂Spring中@Autowired和@Resource的区别
@Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同,并且这也是常见的面试题之一,所以我们今天就来盘它2022-08-08
SpringSecurity授权机制的实现(AccessDecisionManager与投票决策)
本文主要介绍了SpringSecurity授权机制的实现,其核心是AccessDecisionManager和投票系统,下面就来介绍一下,感兴趣的可以了解一下2025-04-04


最新评论