java 找出两个json文件的不同之处

java 复制代码
在这里插入代码片
package cn.test;

import com.google.gson.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
import java.util.Set;

public class JsonDiff {

        public static void main(String[] args) throws IOException {



        String json1 = new String(Files.readAllBytes(Paths.get("/IdeaProjects/hello/src/main/java/cn/test/json1.txt")), StandardCharsets.UTF_8);
        String json2 = new String(Files.readAllBytes(Paths.get("/IdeaProjects/hello/src/main/java/cn/test/json2.txt")), StandardCharsets.UTF_8);

        diffJsonObjects(json1, json2);
    }

    public static void diffJsonObjects(String json1, String json2) {
        Gson gson = new Gson();
        JsonParser parser = new JsonParser();

        JsonElement element1 = parser.parse(json1);
        JsonElement element2 = parser.parse(json2);

        diffElements("root", element1, element2);
    }

    private static void diffElements(String path, JsonElement elem1, JsonElement elem2) {
        if (!elem1.equals(elem2)) {
            if (elem1.isJsonObject() && elem2.isJsonObject()) {
                diffJsonObjects(path, elem1.getAsJsonObject(), elem2.getAsJsonObject());
            } else if (elem1.isJsonArray() && elem2.isJsonArray()) {
                diffJsonArrays(path, elem1.getAsJsonArray(), elem2.getAsJsonArray());
            } else {
                System.out.println("Difference at path '" + path + "': " + elem1 + " != " + elem2);
            }
        }
    }

    private static void diffJsonObjects(String path, JsonObject obj1, JsonObject obj2) {
        Set<Map.Entry<String, JsonElement>> entries1 = obj1.entrySet();
        Set<Map.Entry<String, JsonElement>> entries2 = obj2.entrySet();

        for (Map.Entry<String, JsonElement> entry : entries1) {
            String key = entry.getKey();
            if (!obj2.has(key)) {
                System.out.println("Missing in second JSON at path '" + path + "." + key + "': " + entry.getValue());
            } else {
                diffElements(path + "." + key, entry.getValue(), obj2.get(key));
            }
        }

        for (Map.Entry<String, JsonElement> entry : entries2) {
            if (!obj1.has(entry.getKey())) {
                System.out.println("Missing in first JSON at path '" + path + "." + entry.getKey() + "': " + entry.getValue());
            }
        }
    }

    private static void diffJsonArrays(String path, JsonArray arr1, JsonArray arr2) {
        // 注意:这里简化处理,仅比较数组长度和按索引比较元素,实际应用中可能需要更复杂的逻辑处理不同长度或元素顺序变化的情况。
        if (arr1.size() != arr2.size()) {
            System.out.println("Array size difference at path '" + path + "': " + arr1.size() + " != " + arr2.size());
        } else {
            for (int i = 0; i < arr1.size(); i++) {
                diffElements(path + "[" + i + "]", arr1.get(i), arr2.get(i));
            }
        }
    }
}
相关推荐
SL_staff36 分钟前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko71 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.1 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff1 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
Patrick_Wilson3 小时前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
代码山河3 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目
Escalating_xu4 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅4 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路5 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData5 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设