Skip to content

Commit a85c7ac

Browse files
authored
Merge pull request #10 from codeleep/dev_4.x
Dev 4.x
2 parents 1da2b19 + 945cbad commit a85c7ac

File tree

39 files changed

+383
-342
lines changed

39 files changed

+383
-342
lines changed

Readme.md

Lines changed: 10 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
</dependency>
4242
```
4343
[版本查看](./VersionHistory.md)
44-
2022-04-19 最新版本:3.1.2-RC1-RELEASE
44+
2024-04-11 最新版本:4.0.6-RC1-RELEASE
4545

4646
```java
4747
/**
@@ -58,7 +58,7 @@ public class UseExample {
5858
JsonComparedOption jsonComparedOption = new JsonComparedOption().setIgnoreOrder(true);
5959
JsonCompareResult jsonCompareResult = new DefaultJsonDifference()
6060
.option(jsonComparedOption)
61-
.detectDiff(JSON.parseArray(array1), JSON.parseArray(array2));
61+
.detectDiff(array1, array2);
6262
System.out.println(JSON.toJSONString(jsonCompareResult));
6363
}
6464
}
@@ -178,105 +178,19 @@ ignoreKey.add("high");
178178

179179
#### 3.5 自定义比较器
180180

181-
在我们一个大json文件下。可能遇到某些节点希望实现自定义比较。可以通过 `customComparator` 来进行实现。
181+
在某些特俗场景下,我们需要自己实现比较器。这时可以通过 `me.codeleep.jsondiff.core.handle.HandleFactory` 来进行实现。可以参考 `me.codeleep.jsondiff.core.handle.AbstractHandleFactory` 实现
182182

183-
它配置的key是一个 travelPath 。具体格式参照 ignorePath 。value 则是一个自定义比较器。对于自定义比较器需要继承对应的抽象类。并且实现具体的抽象接口。具体如下:
183+
将我们的实现设置到JsonComparedOption中即可生效。
184184

185-
> 从 3.1.1-RC1-RELEASE 版本开始,自定义比较器的设置移至 JsonDiffOption.getJsonNeatFactory()
186-
> 不再在原先的Option中设置。如果需要使用自定义比较器。请使用 JsonDiffOption.getJsonNeatFactory().addCustomComparator() 进行设置。
185+
对于各个类型的比较器可以尝试继承系统比较器来进行使用:
187186

188-
```java
189-
190-
对象比较:
191-
192-
需要继承 `me.codeleep.jsondiff.core.handle.array.AbstractObjectJsonNeat` 并且重写以下方法。
193-
194-
```java
195-
/**
196-
* 比较对象
197-
* @param expect 期望的json对象
198-
* @param actual 实际的json对象
199-
* @return 返回比较结果
200-
* @throws IllegalAccessException 发生异常直接抛出
201-
*/
202-
JsonCompareResult detectDiff(JSONObject expect, JSONObject actual);
203-
204-
```
205-
206-
数组比较:
207-
208-
需要继承 `me.codeleep.jsondiff.core.handle.object.AbstractArrayJsonNeat` 并且重写以下方法。
209-
210-
```java
211-
/**
212-
* 比较数组.调用入口。需要自己去分别调用 ignoreOrder 和 keepOrder。
213-
* @param expect 期望的json对象
214-
* @param actual 实际的json对象
215-
* @return 返回比较结果
216-
*/
217-
JsonCompareResult detectDiff(JSONArray expect, JSONArray actual);
218-
219-
// 忽略顺序的比较
220-
JsonCompareResult ignoreOrder(JSONArray expect, JSONArray actual);
221-
222-
// 保持顺序比较
223-
JsonCompareResult keepOrder(JSONArray expect, JSONArray actual);
224-
225-
```
226-
227-
基本类型比较:
228-
229-
基本类型指的是java基础类型的包装类型以及Number的实现类型。
230-
231-
需要继承 `me.codeleep.jsondiff.core.handle.primitive.AbstractPrimitiveJsonNeat` 并且重写以下方法。
232-
233-
```java
234-
/**
235-
* 比较数组
236-
* @param expect 基础类型对象
237-
* @param actual 基础类型对象
238-
* @return 返回比较结果
239-
*/
240-
JsonCompareResult detectDiff(Object expect, Object actual);
241-
```
242-
243-
244-
245-
用户可以自己根据 travelPath 来决定使用何种自定义比较。三种比较器都返回 JsonCompareResult 对象作为当前节点的比较结果。对于JsonCompareResult对象。需要填入以下信息:
246-
247-
```java
248-
// 示例
249-
JsonCompareResult result = new JsonCompareResult();
250-
Defects defects = new Defects()
251-
.setActual(actualDiffJson)
252-
.setExpect(expectDiffJson)
253-
.setTravelPath(nextTravelPath)
254-
.setIllustrateTemplate(DATA_TYPE_INCONSISTENT, ClassUtil.getClassName(expectDiffJson), ClassUtil.getClassName(actualDiffJson));
255-
result.addDefects(defects);
256-
```
257-
258-
259-
260-
如果遇到在自定义节点中,还需要使用系统自带的比较器时。
261-
262-
```java
263-
// 该值可以在上述三个抽象类中获得。但需要经自行处理
264-
String abstractTravelPath = "root";
265-
// 下一级是对象
266-
TravelPath nextTravelPath = new TravelPath(abstractTravelPath, mappingKey);
267-
// 下一级是数组
268-
TravelPath nextTravelPath = new TravelPath(abstractTravelPath, expectIndex, actualIndex);
269-
// 获得比较器
270-
JsonDiffUtil.getJsonNeat(expectDiffJson, actualDiffJson, nextTravelPath);
271-
// 执行比较获得结果
272-
JsonCompareResult diff = jsonNeat.diff(expectDiffJson, actualDiffJson, nextTravelPath);
273-
// 本级创建的 JsonCompareResult result 将下一级结果合并
274-
this.result.mergeDefects(diff.getDefectsList());
275-
```
187+
- me.codeleep.jsondiff.core.handle.array.ComplexArrayJsonNeat
188+
- me.codeleep.jsondiff.core.handle.object.ComplexObjectJsonNeat
189+
- me.codeleep.jsondiff.core.handle.other.ComplexOtherJsonNeat
190+
- me.codeleep.jsondiff.core.handle.primitive.ComplexPrimitiveJsonNeat
276191

277-
可以使用上述代码获取系统自带的比较器
192+
在工具中,目前提供了一个 me.codeleep.jsondiff.core.handle.custom.AlignArrayJsonDiff 来实现当数组长度不一致时,进行补齐,从而避免直接返回错误信息
278193

279-
> 自定义比较器值得注意的是: 从匹配到 travelPath 之后,根据不再接管比较操作。一切行为由用户自行定义。但工具依然预留默认的比较器给用户处理后续字段。这需要用户自行进行组合调用。
280194

281195

282196

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package me.codeleep.jsondiff.common.model.neat;
2+
3+
/**
4+
* @author: codeleep
5+
* @createTime: 2024/04/11 下午7:08
6+
* @description:
7+
*/
8+
public interface JsonBuilder {
9+
10+
JsonDiff builder(String json);
11+
12+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package me.codeleep.jsondiff.common.utils;
2+
3+
import me.codeleep.jsondiff.common.exception.JsonDiffException;
4+
import me.codeleep.jsondiff.common.model.neat.JsonBuilder;
5+
6+
/**
7+
* @author: codeleep
8+
* @createTime: 2023/04/16 20:42
9+
* @description: 实现类型
10+
*/
11+
public enum ImplType {
12+
13+
FASTJSON("fastjson", "me.codeleep.jsondiff.impl.fastjson.FastJsonBuilder"),
14+
FASTJSON2("fastjson2", "me.codeleep.jsondiff.impl.fastjson2.FastJson2Builder"),
15+
JACKSON("jackson", "me.codeleep.jsondiff.impl.gson.GsonBuilder"),
16+
GSON("gson", "me.codeleep.jsondiff.impl.jackson.JacksonBuilder");
17+
18+
private String type;
19+
20+
private String builderClassName;
21+
22+
ImplType(String type, String builderClassName) {
23+
this.type = type;
24+
this.builderClassName = builderClassName;
25+
}
26+
27+
public JsonBuilder getBuilder() {
28+
try {
29+
return (JsonBuilder) Class.forName(builderClassName).newInstance();
30+
} catch (Exception e) {
31+
throw new JsonDiffException("Failed to create JsonBuilder instance for " + type, e);
32+
}
33+
}
34+
35+
/**
36+
* 检测使用哪个json框架
37+
* @return
38+
*/
39+
public static ImplType detectJsonParser() {
40+
for (ImplType implType : ImplType.values()) {
41+
try {
42+
Class.forName(implType.builderClassName);
43+
return implType;
44+
} catch (ClassNotFoundException e) {
45+
// Ignore the exception and try the next class name
46+
}
47+
}
48+
throw new JsonDiffException("No JSON parsing framework found, at least one of which implements. fastjson,fastjson2,jackson,gson");
49+
}
50+
}

json-diff-core/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,6 @@
1919
<version>${project.version}</version>
2020
<scope>compile</scope>
2121
</dependency>
22-
<dependency>
23-
<groupId>cn.xiaoandcai</groupId>
24-
<artifactId>json-diff-impl</artifactId>
25-
<version>${project.version}</version>
26-
<scope>compile</scope>
27-
</dependency>
2822
</dependencies>
2923

3024
<properties>

json-diff-core/src/main/java/me/codeleep/jsondiff/core/config/JsonDiffOption.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package me.codeleep.jsondiff.core.config;
22

3-
import me.codeleep.jsondiff.impl.ImplType;
3+
import me.codeleep.jsondiff.common.utils.ImplType;
44

55
/**
66
* @author: codeleep

json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonDiffBuilder.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
import me.codeleep.jsondiff.common.model.neat.JsonDiff;
44
import me.codeleep.jsondiff.core.config.JsonDiffOption;
5-
import me.codeleep.jsondiff.impl.FrameworkImplUtil;
6-
import me.codeleep.jsondiff.impl.ImplType;
5+
import me.codeleep.jsondiff.common.utils.ImplType;
6+
7+
import static me.codeleep.jsondiff.common.utils.ImplType.*;
78

89
/**
910
* @author: codeleep
@@ -15,10 +16,10 @@ public class JsonDiffBuilder {
1516
public static JsonDiff buildObject(String jsonStr) {
1617
ImplType defaultJsonFramework = JsonDiffOption.getDefaultJsonFramework();
1718
switch (defaultJsonFramework) {
18-
case FASTJSON: return FrameworkImplUtil.fastJson(jsonStr);
19-
case FASTJSON2: return FrameworkImplUtil.fastJson2(jsonStr);
20-
case GSON: return FrameworkImplUtil.gson(jsonStr);
21-
case JACKSON: return FrameworkImplUtil.jackson(jsonStr);
19+
case FASTJSON: return FASTJSON.getBuilder().builder(jsonStr);
20+
case FASTJSON2: return FASTJSON2.getBuilder().builder(jsonStr);
21+
case GSON: return GSON.getBuilder().builder(jsonStr);
22+
case JACKSON: return JACKSON.getBuilder().builder(jsonStr);
2223
}
2324
return null;
2425
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>cn.xiaoandcai</groupId>
8+
<artifactId>json-diff-parent</artifactId>
9+
<version>4.0.5-RC1-RELEASE</version>
10+
<relativePath>../../pom.xml</relativePath>
11+
</parent>
12+
13+
<version>4.0.5-RC1-RELEASE</version>
14+
<artifactId>json-diff-impl-fastjson</artifactId>
15+
16+
<properties>
17+
<maven.compiler.source>8</maven.compiler.source>
18+
<maven.compiler.target>8</maven.compiler.target>
19+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
20+
</properties>
21+
22+
<dependencies>
23+
<dependency>
24+
<groupId>cn.xiaoandcai</groupId>
25+
<artifactId>json-diff-core</artifactId>
26+
<version>${project.version}</version>
27+
</dependency>
28+
<dependency>
29+
<groupId>com.alibaba</groupId>
30+
<artifactId>fastjson</artifactId>
31+
<version>1.2.74</version>
32+
</dependency>
33+
</dependencies>
34+
35+
</project>

json-diff-impl/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonArray.java renamed to json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonArray.java

File renamed without changes.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package me.codeleep.jsondiff.impl.fastjson;
2+
3+
import me.codeleep.jsondiff.common.model.neat.JsonDiff;
4+
import me.codeleep.jsondiff.common.model.neat.JsonBuilder;
5+
6+
/**
7+
* @author: codeleep
8+
* @createTime: 2024/04/11 下午7:10
9+
* @description:
10+
*/
11+
public class FastJsonBuilder implements JsonBuilder {
12+
@Override
13+
public JsonDiff builder(String json) {
14+
Object parse = com.alibaba.fastjson.JSON.parse(json);
15+
if (parse instanceof com.alibaba.fastjson.JSONObject) {
16+
return new FastJsonObject((com.alibaba.fastjson.JSONObject)parse);
17+
}
18+
if (parse instanceof com.alibaba.fastjson.JSONArray) {
19+
return new FastJsonArray((com.alibaba.fastjson.JSONArray)parse);
20+
}
21+
return null;
22+
}
23+
}

json-diff-impl/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonObject.java renamed to json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonObject.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package me.codeleep.jsondiff.impl.fastjson;
22

3-
import com.alibaba.fastjson.JSONArray;
3+
import com.alibaba.fastjson.JSON;
44
import com.alibaba.fastjson.JSONObject;
5-
import com.alibaba.fastjson2.JSON;
65
import me.codeleep.jsondiff.common.model.neat.JsonDiff;
76
import me.codeleep.jsondiff.common.model.neat.JsonDiffObject;
87

9-
import java.util.HashMap;
108
import java.util.HashSet;
119
import java.util.Set;
1210

@@ -41,7 +39,7 @@ public Set<String> keySet() {
4139

4240
@Override
4341
public Object format() {
44-
return JSON.to(HashMap.class, jsonObject);
42+
return JSON.toJSONString(jsonObject);
4543
}
4644

4745
@Override

0 commit comments

Comments
 (0)