MCPcopy Index your code
hub / github.com/LianjiaTech/json-diff

github.com/LianjiaTech/json-diff @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
187 symbols 735 edges 39 files 134 documented · 72% updated 4y ago★ 612 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

JsonDiff介绍

JsonDiff提供了对Json通用的diff能力,支持Json字符串的深度比较,支持无序数组比较,内含多种算法模型满足对Json比较时各种需求。 同时JsonDiff也支持自定义算法、算法模型可配置、噪音字段过滤、自定义比较字段等多种通用功能。

1.JsonDiff是什么

JsonDiff可以对输入的两个Json字符串进行差值比较,利用diff算法得到差异化最小的比较结果。diff结果会展示2个Json字符串中不同结果的值、路径以及修改类型。

例如: - 输入: json jsonA: {"name":"张三","phon3":"12345678901","g3nder":"男","timestamp":"1646201087874"} jsonB: {"name":"张三","b1rth":"2000-01-01","g3nder":"男","timestamp":"1646201087875"} - diff结果: json [{"diffType":"DELETE","left":"12345678901","leftPath":"phon3"},{"diffType":"MODIFY","left":"1646201087874","right":"1646201087875","leftPath":"timestamp","rightPath":"timestamp"},{"diffType":"ADD","right":"2000-01-01","rightPath":"b1rth"}]

2.diff的算法模型

json的比较算法可以抽象为针对四种json基本结构的比较(JsonArray,JsonObject,JsonNull,JsonPrimitive),因此json-diff主要抽象了以下四种比较器能力以及默认实现。

基本结构 算法模型 实现
JsonObject ObjectComparator 针对对象类型的比较
JsonArray ArrayComparator 针对数组类型的比较
JsonPrimitive PrimitiveComparator 针对基本类型的比较
JsonNull NullComparator 针对NULL的比较

3.features

  • JsonObject比较时,忽略噪声字段
  • JsonObject比较时,仅比较第一个json的所有属性(项目重构时一般只关注新接口是否完全覆盖老接口,新接口多字段无所谓)

    SimpleObject
    LeftJoin

  • JsonArray比较时,严格按照顺序比较

    SimpleObject

  • JsonArray比较时,根据相似度匹配比较

    LeftJoin

  • JsonArray比较时,按照某个主键字段匹配比较(withSpecialPath),例如比较name都是张三的数据

    SimpleObject
    LeftJoin

  • 织入自定义算法

4.diff的使用方式

步骤1:构造Diff入口
  • 简单构造(全部使用默认算法):Diff diff = new Diff(); java Diff diff = new Diff();
  • 灵活选择比较算法组合: java new Diff().withObjectComparator(objectComparator).withArrayComparator(arrayComparator).withPrimitiveAlgorithm(primitiveComparator).withNullComparator(nullComparator)
步骤2:执行diff
  • 严格比较两个json字符串是否相等 java diff.diff(jsonA, jsonB)
  • 过滤字段 java diff.withNoisePahList(noiseList).diff(jsonA, jsonB) 路径设置说明:字段路径中包含数组路径时,如"[0].name",自定义路径忽略数组索引号,设置成"name"即可。
  • 数组比较时,指定主键字段 java diff.withSpecialPath(specialPath).diff(jsonA, jsonB)

5、第三方依赖

含义
gson包 用于解析json最基础的工具类
guava包 用于字符串拼接、集合合并、字符串转换等功能的工具类

Extension points exported contracts — how you extend this code

PrimitiveComparator (Interface)
基本类型比较器接口,用于2个JsonElement均为基本类型的时对2个元素进行比较。 @Author JingWei @create 2022/2/23 [11 implementers]
src/main/java/com/ke/diff/algorithm/primitive/PrimitiveComparator.java
OtherComparator (Interface)
其他类型比较器接口,用于2个JsonElement不同时为对象、数组、空、基本类型时对2个元素进行比较。 举例:第一个要比较类型为对象类型,第二个要比较类型为数组类型。 @Author JingWei @create 2022/2/23 [11 …
src/main/java/com/ke/diff/algorithm/other/OtherComparator.java
NullComparator (Interface)
空类型比较器接口,用于2个JsonElement均为JsonNull时对2个元素进行比较。 @Author JingWei @create 2022/2/23 [11 implementers]
src/main/java/com/ke/diff/algorithm/nulls/NullComparator.java
ArrayComparator (Interface)
数组类型比较器接口,用于2个JsonElement均为数组时对2个元素进行比较。 @Author JingWei @create 2022/2/23 [1 implementers]
src/main/java/com/ke/diff/algorithm/array/ArrayComparator.java
ObjectComparator (Interface)
对象类型比较器接口,用于2个JsonElement均为JsonObject时对2个元素进行比较。 @Author JingWei @create 2022/2/23 [1 implementers]
src/main/java/com/ke/diff/algorithm/object/ObjectComparator.java

Core symbols most depended-on inside this repo

getLeft
called by 53
src/main/java/com/ke/diff/model/Result.java
getRight
called by 53
src/main/java/com/ke/diff/model/Result.java
diff
called by 36
src/main/java/com/ke/diff/algorithm/nulls/NullComparator.java
withNoisePahList
called by 30
src/main/java/com/ke/diff/Diff.java
withAlgorithmEnum
called by 25
src/main/java/com/ke/diff/Diff.java
withSpecialPath
called by 15
src/main/java/com/ke/diff/Diff.java
getDiffResultModels
called by 15
src/main/java/com/ke/diff/model/DiffContext.java
diffElement
called by 15
src/main/java/com/ke/diff/algorithm/array/ArrayComparator.java

Shape

Method 148
Class 32
Interface 6
Enum 1

Languages

Java100%

Modules by API surface

src/main/java/com/ke/diff/Diff.java18 symbols
src/main/java/com/ke/diff/model/PathModule.java16 symbols
src/main/java/com/ke/diff/algorithm/array/SimilarArrayComparator.java13 symbols
src/main/java/com/ke/diff/model/Result.java11 symbols
src/test/java/com/ke/diff/algorithm/array/SimpleArrayComparatorTest.java10 symbols
src/main/java/com/ke/diff/model/SingleNodeDifference.java10 symbols
src/test/java/com/ke/diff/algorithm/array/SimilarArrayComparatorTest.java9 symbols
src/test/java/com/ke/diff/diff/DiffTest.java8 symbols
src/main/java/com/ke/diff/model/DiffContext.java8 symbols
src/main/java/com/ke/diff/AlgorithmEnum.java8 symbols
src/main/java/com/ke/diff/algorithm/object/AbstractObject.java7 symbols
src/test/java/com/ke/diff/model/PathModuleTest.java4 symbols

For agents

$ claude mcp add json-diff \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact