You need to enable JavaScript to run this app. Java如何基于公共键值比较两个JSON对象并合并匹配的对象块
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 18:03:01