利用Jackson實(shí)現(xiàn)JSON數(shù)據(jù)的合并
Jackson 庫(kù)實(shí)現(xiàn) JSON 數(shù)據(jù)的合并,可以采用基于樹(shù)模型的深度合并(遞歸策略),可以保留兩個(gè) JSON 的所有層級(jí)數(shù)據(jù),避免覆蓋沖突。在實(shí)際開(kāi)發(fā)中,Jackson 功能豐富、安全可靠并且具有比較好的兼容性,這讓程序開(kāi)發(fā)人員可以很方便地實(shí)現(xiàn) JavaBean 和以 “鍵 : 值” 結(jié)構(gòu)保存的 JSON 數(shù)據(jù)的相互轉(zhuǎn)換。
1、創(chuàng)建 Jackson 工具類(lèi)
創(chuàng)建 JacksonUtil 類(lèi)(Jackson工具類(lèi)),實(shí)現(xiàn)JSON數(shù)據(jù)的合并方法。
package com.pjb.utils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* Jackson工具類(lèi)
* @author pan_junbiao
**/
public class JacksonUtil
{
private static ObjectMapper mapper = new ObjectMapper();
/**
* 合并 JSON 數(shù)據(jù)
* @return 合并后的 JsonNode 對(duì)象
*/
public static JsonNode mergeJsonNode(JsonNode mainNode, JsonNode updateNode)
{
//參數(shù)校驗(yàn)
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
{
// 非對(duì)象類(lèi)型直接覆蓋(如數(shù)組、基本類(lèi)型)
return updateNode;
}
}
/**
* 合并 JSON 數(shù)據(jù)
* @return 合并后的 JSON 字符串
*/
public static String mergeJsonString(String mainJson, String updateJson)
{
//參數(shù)校驗(yàn)
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 數(shù)據(jù)
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、測(cè)試 JSON 數(shù)據(jù)的合并
創(chuàng)建測(cè)試方法,測(cè)試 JSON 數(shù)據(jù)的合并結(jié)果。
/**
* 合并 JSON 數(shù)據(jù)
*/
@Test
public void mergeJsonTest()
{
try
{
String mainNode = "{\n" +
" \"userId\": 1,\n" +
" \"userName\": \"pan_junbiao的博客\"\n" +
"}";
String updateNode = "{\n" +
" \"userName\": \"pan_junbiao的博客_001\",\n" +
" \"blogName\": \"您好,歡迎訪(fǎng)問(wèn) pan_junbiao的博客\",\n" +
" \"blogUrl\": \"https://blog.csdn.net/pan_junbiao\",\n" +
" \"hobbies\": [\"游泳\", \"籃球\", \"足球\"]\n" +
"}";
//合并 JSON 數(shù)據(jù)
String result = JacksonUtil.mergeJsonString(mainNode, updateNode);
//打印結(jié)果
System.out.println(result);
} catch (Exception ex)
{
ex.printStackTrace();
}
}執(zhí)行結(jié)果:
{
"userId": 1,
"userName": "pan_junbiao的博客_001",
"blogName": "您好,歡迎訪(fǎng)問(wèn) pan_junbiao的博客",
"blogUrl": "https://blog.csdn.net/pan_junbiao",
"hobbies": ["游泳", "籃球", "足球"]
}
到此這篇關(guān)于利用Jackson實(shí)現(xiàn)JSON數(shù)據(jù)的合并的文章就介紹到這了,更多相關(guān)Jackson JSON數(shù)據(jù)合并內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis-plus實(shí)現(xiàn)四種lambda表達(dá)式方式
使用了lambda表達(dá)式 可以通過(guò)方法引用的方式來(lái)使用實(shí)體字段名的操作,本文主要介紹了mybatis-plus實(shí)現(xiàn)四種lambda表達(dá)式方式,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
SpringBoot事務(wù)失效問(wèn)題原因、場(chǎng)景與解決方案
在SpringBoot開(kāi)發(fā)中,事務(wù)管理是保證數(shù)據(jù)一致性和完整性的核心機(jī)制,然而,許多開(kāi)發(fā)者在使用@Transactional注解時(shí),可能會(huì)遇到事務(wù)失效的問(wèn)題,導(dǎo)致數(shù)據(jù)異?;驑I(yè)務(wù)邏輯錯(cuò)誤,本文將深入分析SpringBoot中事務(wù)失效的常見(jiàn)原因,并結(jié)合實(shí)際場(chǎng)景給出解決方案2025-07-07
詳解多云架構(gòu)下的JAVA微服務(wù)技術(shù)解析
本文介紹了基于開(kāi)源自建和適配云廠(chǎng)商開(kāi)發(fā)框架兩種構(gòu)建多云架構(gòu)的思路,以及這些思路的優(yōu)缺點(diǎn)2021-05-05
springboot常見(jiàn)登錄(注冊(cè))幾種實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了如何實(shí)現(xiàn)用戶(hù)注冊(cè)、登錄和微信掃碼登錄功能,注冊(cè)功能通過(guò)手機(jī)號(hào)和短信驗(yàn)證碼完成,登錄功能通過(guò)賬號(hào)密碼和微信掃碼兩種方式實(shí)現(xiàn),并使用JWT進(jìn)行單點(diǎn)登錄2026-02-02
java設(shè)計(jì)模式學(xué)習(xí)之裝飾模式
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式學(xué)習(xí)之裝飾模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
SpringBoot利用Undertow實(shí)現(xiàn)高可用的反向代理配置
Undertow是一個(gè)采用Java開(kāi)發(fā)的靈活的高性能Web服務(wù)器,本文將介紹如何利用?Undertow?服務(wù)器的反向代理能力,實(shí)現(xiàn)高可用的反向代理配置,感興趣的可以了解下2025-06-06

