You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在javax中合并JSON?用新JSON更新旧JSON的实现方法

在javax/Java EE环境下实现JSON数组的增量合并(仅同步新增内容)

我来帮你解决这个JSON增量合并的问题,在Java(javax/Java EE)环境下,原生API并没有直接提供JSON合并的工具,所以我们通常会借助成熟的JSON处理库来实现,Jackson是Java生态里最常用的选择之一,下面就针对你的场景给出具体实现方案。

核心思路

你的需求是对比两个JSON数组,仅将新数组中旧数组没有的元素同步过去,核心步骤分为:

  1. 读取并解析旧JSON和新JSON文件为Java对象集合
  2. 基于thumbnail字段判断新数组中独有的元素
  3. 将新增元素追加到旧数组对应的集合中
  4. 将更新后的集合写回旧JSON文件

方案一:使用POJO类(推荐,代码更清晰)

首先定义一个对应JSON元素的POJO类,并重写equals和hashCode方法,这样可以直接用集合的contains方法判断元素是否存在:

import java.util.Objects;

public class ThumbnailItem {
    private String thumbnail;

    // Getter & Setter
    public String getThumbnail() {
        return thumbnail;
    }

    public void setThumbnail(String thumbnail) {
        this.thumbnail = thumbnail;
    }

    // 基于thumbnail字段判断两个对象是否相同
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ThumbnailItem that = (ThumbnailItem) o;
        return Objects.equals(thumbnail, that.thumbnail);
    }

    @Override
    public int hashCode() {
        return Objects.hash(thumbnail);
    }
}

然后编写合并逻辑的核心代码:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class JsonMergeTool {
    public static void main(String[] args) {
        // 初始化Jackson的ObjectMapper,用于JSON和Java对象的互转
        ObjectMapper objectMapper = new ObjectMapper();
        File oldJsonFile = new File("oldJson.json");
        File newJsonFile = new File("newJson.json");

        try {
            // 读取并解析两个JSON文件为对象列表
            List<ThumbnailItem> oldItems = objectMapper.readValue(
                oldJsonFile,
                objectMapper.getTypeFactory().constructCollectionType(List.class, ThumbnailItem.class)
            );
            List<ThumbnailItem> newItems = objectMapper.readValue(
                newJsonFile,
                objectMapper.getTypeFactory().constructCollectionType(List.class, ThumbnailItem.class)
            );

            // 筛选出新列表中独有的元素
            List<ThumbnailItem> addedItems = new ArrayList<>();
            for (ThumbnailItem newItem : newItems) {
                if (!oldItems.contains(newItem)) {
                    addedItems.add(newItem);
                }
            }

            // 将新增元素追加到旧列表
            oldItems.addAll(addedItems);

            // 将更新后的列表写回旧JSON文件(带格式化输出,可读性更好)
            objectMapper.writerWithDefaultPrettyPrinter().writeValue(oldJsonFile, oldItems);

            System.out.println("JSON合并完成,已同步所有新增内容");
        } catch (IOException e) {
            e.printStackTrace();
            // 实际项目中可以添加更友好的异常处理,比如日志记录、错误提示等
        }
    }
}

方案二:使用Map(无需定义POJO)

如果不想创建POJO类,也可以直接用List<Map<String, Object>>来处理,只是判断元素是否存在需要手动遍历对比:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class JsonMergeWithMap {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        File oldJsonFile = new File("oldJson.json");
        File newJsonFile = new File("newJson.json");

        try {
            // 解析为Map列表
            List<Map<String, Object>> oldMaps = objectMapper.readValue(
                oldJsonFile,
                objectMapper.getTypeFactory().constructCollectionType(List.class, Map.class)
            );
            List<Map<String, Object>> newMaps = objectMapper.readValue(
                newJsonFile,
                objectMapper.getTypeFactory().constructCollectionType(List.class, Map.class)
            );

            // 筛选新增元素
            List<Map<String, Object>> addedMaps = new ArrayList<>();
            for (Map<String, Object> newMap : newMaps) {
                String newThumbnail = (String) newMap.get("thumbnail");
                boolean exists = false;
                for (Map<String, Object> oldMap : oldMaps) {
                    String oldThumbnail = (String) oldMap.get("thumbnail");
                    if (newThumbnail.equals(oldThumbnail)) {
                        exists = true;
                        break;
                    }
                }
                if (!exists) {
                    addedMaps.add(newMap);
                }
            }

            // 追加并写回文件
            oldMaps.addAll(addedMaps);
            objectMapper.writerWithDefaultPrettyPrinter().writeValue(oldJsonFile, oldMaps);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

依赖准备

如果是Maven项目,需要在pom.xml中添加Jackson的依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 建议使用最新稳定版 -->
</dependency>

注意事项

  • 如果旧JSON文件不存在,需要提前判断并创建空数组,避免解析报错
  • 若JSON元素的判断逻辑更复杂(比如多个字段联合判断),只需要修改equals方法(POJO方案)或者对比逻辑(Map方案)即可
  • 生产环境中建议添加日志记录,替换掉printStackTrace()的简单异常处理

内容的提问来源于stack exchange,提问作者kohane15

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:07:55