后台管理这样的系统一直存在着谜一样的复杂性,老四最近就遇到了一个需求,需要将两个比较复杂的 JSON 结构体合并为一个 JSON 体,其中 A JSON 的优先级要高于 B JSON 优先级,对于 A 中出现的 JSONArray,如果也在 B 中同样出现了,那么将两个 JSONArray 中的元素进行合并且去重,形如下面这样:
JSON 格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "min_position": 3, "has_more_items": false, "items_html": "Bike", "new_latent_count": 2, "data": { "length": 22, "text": "高老四博客" }, "numericalArray": [ "glorze.com", "oom.cool" ] } |
JSON B
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "min_position": 4, "has_more_items": true, "new_latent_count": 2, "data": { "length": 23, "text": "高老四导航" }, "numericalArray": [ "glorze.com", "oom.cool" ] } |
如上面两个 JSON 对象所示,我要将 A、B 两个 JSON 合并在一起,当然 A 的优先级最高,即某些属性及属性值如果在 JSON B 中也存在的话,那也只保留 JSON A 中该属性的值,当然,如果某个属性在 A 中不存在但是在 B 中存在,那么最终的合并结果也要保留这个属性,即使 A 的优先级最高。所以我期待的结果是下面这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "min_position": 3, "items_html": "Bike", "data": { "length": 22, "text": "高老四博客" }, "new_latent_count": 2, "numericalArray": [ "glorze.com", "oom.cool" ], "has_more_items": false } |
那么,上述这样的需求,解决方案大致有以下两种:
手敲代码递归合并 JSON
仅作为思路展示,请不要直接照搬!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
private static void merge(JSONObject firstJSONObject, JSONObject secondJSONObject) { Iterator<String> keys = firstJSONObject.keySet().iterator(); Object object1; Object object2; while (keys.hasNext()) { String next = keys.next(); if (firstJSONObject.isEmpty()) { continue; } object1 = firstJSONObject.get(next); if (!secondJSONObject.containsKey(next)) { secondJSONObject.put(next, object1); } object2 = secondJSONObject.get(next); if (object1 instanceof JSONObject && object2 instanceof JSONObject) { merge((JSONObject) object1, (JSONObject) object2); } } } public static void main(String[] args) { String jsonA = "{ \"min_position\": 3, \"has_more_items\": false, \"items_html\": \"Bike\", \"new_latent_count\": 2, \"data\": { \"length\": 22, \"text\": \"高老四博客\" }, \"numericalArray\": [ \"glorze.com\", \"oom.cool\" ] }"; String jsonB = "{ \"min_position\": 4, \"has_more_items\": true, \"new_latent_count\": 2, \"data\": { \"length\": 23, \"text\": \"高老四导航\" }, \"numericalArray\": [ \"glorze.com\", \"oom.cool\" ] }"; JSONObject j1 = JSON.parseObject(jsonA); JSONObject j2 = JSON.parseObject(jsonB); merge(j1, j2); System.out.println(j1.toJSONString()); } |
开源项目「jsonmerge」
在搜寻解决方案的时候,老四发现其实早就有人做这样的事情了,所以我们可以直接使用这个 GitHub 上的开源项目:
不过这个项目在 Maven Repository 中还没有收录,所以在使用时,你可以使用二方库,或者下载下来直接放在本地即可。最基础的用法比较简单,直接合并即可,此外也提供了「JsonMergeOption」工具能够按照 JSON 的路径搜寻的方式使用更高级的、定制化的 json 合并功能,具体可以参考官方的「README」。
1 2 3 4 5 6 |
public static void main(String[] args) { String jsonA = "{ \"min_position\": 3, \"has_more_items\": false, \"items_html\": \"Bike\", \"new_latent_count\": 2, \"data\": { \"length\": 22, \"text\": \"高老四博客\" }, \"numericalArray\": [ \"glorze.com\", \"oom.cool\" ] }"; String jsonB = "{ \"min_position\": 4, \"has_more_items\": true, \"new_latent_count\": 2, \"data\": { \"length\": 23, \"text\": \"高老四导航\" }, \"numericalArray\": [ \"glorze.com\", \"oom.cool\" ] }"; net.minidev.json.JSONObject result = new JsonMerger<>(net.minidev.json.JSONObject.class).merge(jsonA, jsonB); System.out.println(result.toJSONString()); } |
更多 JSON 相关工具可以参考本站导航『json』标签:
相关文章阅读
- 《Recursively merge JSON structures》
- 《Merge (Concat) Multiple JSONObjects in Java》
- 《分享一款可以打开大 Json 文本文件的神器 – Dadroit Viewer》
- 《全文搜索引擎 Elasticsearch 入门以及踩坑记录详细版》
- 《阿里巴巴Java开发手册第六章-二方库依赖篇》
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可以加入本站封闭式交流论坛「DownHub」开启新世界的大门,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。