Java如何基于公共键值比较两个JSON对象并合并匹配的对象块
Java 按title字段合并两个JSON数组实现方案
实现思路
- 借助你已经在使用的Gson库完成JSON的序列化、反序列化操作
- 用哈希映射存储第一个JSON数组的所有元素,key为title字段值,value为对应的JSON对象,可保留原有数组顺序
- 遍历第二个JSON数组,按title匹配到对应对象后,将第二个数组对象的所有字段合并到已存储的对象中
- 最终输出哈希映射中所有对象组成的数组即可
依赖配置
如果项目还未引入Gson,Maven添加如下依赖即可:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
完整实现代码
import com.google.gson.*; import java.util.*; public class JsonMergeUtil { private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); private static final String MATCH_KEY = "title"; public static String mergeJsonArraysByTitle(String jsonStr1, String jsonStr2) { // 解析两个输入JSON字符串为数组对象 JsonArray array1 = JsonParser.parseString(jsonStr1).getAsJsonArray(); JsonArray array2 = JsonParser.parseString(jsonStr2).getAsJsonArray(); // LinkedHashMap保证输出顺序和第一个数组的原有顺序一致 Map<String, JsonObject> titleObjMap = new LinkedHashMap<>(); // 先存入第一个数组的所有元素 for (JsonElement element : array1) { JsonObject obj = element.getAsJsonObject(); if (obj.has(MATCH_KEY) && !obj.get(MATCH_KEY).isJsonNull()) { String title = obj.get(MATCH_KEY).getAsString(); titleObjMap.put(title, obj); } } // 遍历第二个数组,合并匹配到title的对象字段 for (JsonElement element : array2) { JsonObject obj = element.getAsJsonObject(); if (obj.has(MATCH_KEY) && !obj.get(MATCH_KEY).isJsonNull()) { String title = obj.get(MATCH_KEY).getAsString(); if (titleObjMap.containsKey(title)) { JsonObject existObj = titleObjMap.get(title); for (Map.Entry<String, JsonElement> entry : obj.entrySet()) { existObj.add(entry.getKey(), entry.getValue()); } } // 若需要保留第二个数组独有的title对象,放开下面的注释即可 // else { // titleObjMap.put(title, obj); // } } } // 组装结果数组 JsonArray resultArray = new JsonArray(); for (JsonObject obj : titleObjMap.values()) { resultArray.add(obj); } return gson.toJson(resultArray); } // 测试方法 public static void main(String[] args) { String json1 = "[\n" + " {\"title\": \"Title1\",\"newFiled\": 5},\n" + " {\"title\": \"Title2\",\"newFiled\": 3},\n" + " {\"title\": \"Title33\",\"newFiled\": 10},\n" + " {\"title\": \"Title44\",\"newFiled\": 9}\n" + "]"; String json2 = "[\n" + " {\"title\": \"Title1\",\"filed1\": 5},\n" + " {\"title\": \"Title2\",\"filed 1\": 3}\n" + "]"; String mergedResult = mergeJsonArraysByTitle(json1, json2); System.out.println(mergedResult); } }
注意事项
- 你之前用到的JSONCompare是JSON差异对比工具,仅支持校验两个JSON的异同,不支持合并操作,无法实现需求
- 上述代码默认保留第一个JSON数组的所有元素和顺序,仅合并第二个数组中匹配到title的字段,符合你给出的预期输出要求
内容的提问来源于stack exchange,提问作者lahiruW
相关产品推荐
相关产品推荐

