利用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\": \"您好,歡迎訪問(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": "您好,歡迎訪問(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)文章
Spring?Boot:Idea從零開(kāi)始初始化后臺(tái)項(xiàng)目的教程
這篇文章主要介紹了Spring?Boot:Idea從零開(kāi)始初始化后臺(tái)項(xiàng)目的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Sentinel核心類(lèi)之Entry類(lèi)解讀
這篇文章主要介紹了Sentinel核心類(lèi)之Entry類(lèi)解讀,Sentinel中Entry可以理解為每次進(jìn)入資源的一個(gè)憑證,如果調(diào)用SphO.entry()或者SphU.entry()能獲取Entry對(duì)象,代表獲取了憑證,沒(méi)有被限流,否則拋出一個(gè)BlockException,需要的朋友可以參考下2023-12-12一文搞懂Spring中@Autowired和@Resource的區(qū)別
@Autowired?和?@Resource?都是?Spring/Spring?Boot?項(xiàng)目中,用來(lái)進(jìn)行依賴注入的注解。它們都提供了將依賴對(duì)象注入到當(dāng)前對(duì)象的功能,但二者卻有眾多不同,并且這也是常見(jiàn)的面試題之一,所以我們今天就來(lái)盤(pán)它2022-08-08Java學(xué)習(xí)筆記:關(guān)于Java?double類(lèi)型相加問(wèn)題
這篇文章主要介紹了關(guān)于Java?double類(lèi)型相加問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java利用反射動(dòng)態(tài)設(shè)置對(duì)象字段值的實(shí)現(xiàn)
橋梁信息維護(hù)需要做到字段級(jí)別的權(quán)限控制,本文主要介紹了Java利用反射動(dòng)態(tài)設(shè)置對(duì)象字段值的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01SpringSecurity授權(quán)機(jī)制的實(shí)現(xiàn)(AccessDecisionManager與投票決策)
本文主要介紹了SpringSecurity授權(quán)機(jī)制的實(shí)現(xiàn),其核心是AccessDecisionManager和投票系統(tǒng),下面就來(lái)介紹一下,感興趣的可以了解一下2025-04-04Jackson處理Optional時(shí)遇到問(wèn)題的解決與分析
Optional是Java實(shí)現(xiàn)函數(shù)式編程的強(qiáng)勁一步,并且?guī)椭诜妒街袑?shí)現(xiàn),但是Optional的意義顯然不止于此,下面這篇文章主要給大家介紹了關(guān)于Jackson處理Optional時(shí)遇到問(wèn)題的解決與分析的相關(guān)資料,需要的朋友可以參考下2022-02-02