政府网站app百度论坛发帖
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": ["游泳", "篮球", "足球"]
}