Skip to content

Commit d414574

Browse files
committed
feature(JsonNeat): 支持替换默认比较器
1. 支持替换默认比较器 2. 比较结果添加附加数据对象
1 parent 856c209 commit d414574

File tree

5 files changed

+150
-29
lines changed

5 files changed

+150
-29
lines changed

json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/Defects.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package me.codeleep.jsondiff.common.model;
22

3+
import java.util.HashMap;
4+
35
/**
46
* @author: codeleep
57
* @createTime: 2022/07/30 19:26
@@ -27,6 +29,11 @@ public class Defects {
2729
*/
2830
private String illustrate;
2931

32+
/**
33+
* 附加数据
34+
*/
35+
private HashMap<String, Object> additionalData;
36+
3037

3138
public Defects setExpect(Object expect) {
3239
this.expect = expect;
@@ -68,4 +75,26 @@ public Object getActual() {
6875
public String getIllustrate() {
6976
return illustrate;
7077
}
78+
79+
public HashMap<String, Object> getAdditionalData() {
80+
return additionalData;
81+
}
82+
83+
public Object getAdditionalData(String key) {
84+
if (additionalData == null) {
85+
return null;
86+
}
87+
return additionalData.get(key);
88+
}
89+
90+
public void setAdditionalData(HashMap<String, Object> additionalData) {
91+
this.additionalData = additionalData;
92+
}
93+
94+
public void pushAdditionalData(String key, Object data) {
95+
if (this.additionalData == null) {
96+
this.additionalData = new HashMap<>();
97+
}
98+
this.additionalData.put(key, data);
99+
}
71100
}

json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/JsonComparedOption.java

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package me.codeleep.jsondiff.common.model;
22

3-
import me.codeleep.jsondiff.common.model.neat.JsonNeat;
4-
5-
import java.util.*;
3+
import java.util.HashMap;
4+
import java.util.HashSet;
5+
import java.util.Map;
66

77
/**
88
* @author: codeleep
@@ -33,11 +33,9 @@ public class JsonComparedOption {
3333
private HashSet<String> ignoreKey;
3434

3535
/**
36-
* 指定的path使用自定义比较器
37-
* key: 与ignorePath格式一致
38-
* value: 继承 AbstractArrayJsonNeat,AbstractObjectJsonNeat,AbstractPrimitiveJsonNeat. 并且实现对应格式接口的字节码
36+
* 强制使用系统默认比较器
3937
*/
40-
private Map<String, Class<? extends JsonNeat>> customComparator = new HashMap<>();
38+
private boolean mandatoryDefaultNeat = false;
4139

4240

4341
public JsonComparedOption() {
@@ -64,11 +62,6 @@ public JsonComparedOption setIgnoreKey(HashSet<String> ignoreKey) {
6462
return this;
6563
}
6664

67-
public JsonComparedOption setCustomComparator(Map<String, Class<? extends JsonNeat>> customComparator ) {
68-
this.customComparator = customComparator;
69-
return this;
70-
}
71-
7265
public boolean isIgnoreOrder() {
7366
return ignoreOrder;
7467
}
@@ -94,11 +87,11 @@ public HashSet<String> getIgnoreKey() {
9487
return ignoreKey;
9588
}
9689

90+
public boolean isMandatoryDefaultNeat() {
91+
return mandatoryDefaultNeat;
92+
}
9793

98-
public Map<String, Class<? extends JsonNeat>> getCustomComparator() {
99-
if (customComparator == null) {
100-
customComparator = new HashMap<String, Class<? extends JsonNeat>>();
101-
}
102-
return customComparator;
94+
public void setMandatoryDefaultNeat(boolean mandatoryDefaultNeat) {
95+
this.mandatoryDefaultNeat = mandatoryDefaultNeat;
10396
}
10497
}

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

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

33
import com.alibaba.fastjson2.JSONArray;
44
import com.alibaba.fastjson2.JSONObject;
5+
import me.codeleep.jsondiff.common.exception.JsonDiffException;
56

67
import static me.codeleep.jsondiff.common.model.Constant.NULL;
78

@@ -64,4 +65,12 @@ public static String getClassName(Object obj) {
6465
}
6566
return obj.getClass().getName();
6667
}
68+
69+
public static <T> T getClassNameInstance(Class<T> clazz) {
70+
try {
71+
return clazz.newInstance();
72+
} catch (Exception e) {
73+
throw new JsonDiffException(String.format("无法实例化: %s", clazz), e);
74+
}
75+
}
6776
}

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

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,11 @@
55
import me.codeleep.jsondiff.common.exception.JsonDiffException;
66
import me.codeleep.jsondiff.common.model.ComparatorEnum;
77
import me.codeleep.jsondiff.common.model.TravelPath;
8+
import me.codeleep.jsondiff.common.model.neat.JsonNeat;
89
import me.codeleep.jsondiff.common.utils.RunTimeDataFactory;
910
import me.codeleep.jsondiff.core.handle.array.AbstractArrayJsonNeat;
10-
import me.codeleep.jsondiff.core.handle.array.ComplexArrayJsonNeat;
1111
import me.codeleep.jsondiff.core.handle.object.AbstractObjectJsonNeat;
12-
import me.codeleep.jsondiff.core.handle.object.ComplexObjectJsonNeat;
1312
import me.codeleep.jsondiff.core.handle.primitive.AbstractPrimitiveJsonNeat;
14-
import me.codeleep.jsondiff.core.handle.primitive.PrimitiveTypeJsonNeat;
15-
import me.codeleep.jsondiff.common.model.neat.JsonNeat;
16-
17-
import java.util.Map;
1813

1914
public class JsonDiffUtil {
2015

@@ -29,18 +24,18 @@ public static JsonNeat getJsonNeat(Object expect, Object actual, TravelPath trav
2924
if (!ClassUtil.isSameClass(expect, actual)) {
3025
return null;
3126
}
32-
Map<String, Class<? extends JsonNeat>> customComparator = RunTimeDataFactory.getOptionInstance().getCustomComparator();
33-
String abstractTravelPath = travelPath.getAbstractTravelPath();
34-
boolean custom = customComparator.containsKey(abstractTravelPath);
27+
boolean defaultNeat = RunTimeDataFactory.getOptionInstance().isMandatoryDefaultNeat();
28+
Class<? extends JsonNeat> customComparator = JsonNeatFactory.getCustomComparator(travelPath.getAbstractTravelPath());
29+
boolean custom = customComparator != null;
3530
// 返回系统默认处理器
3631
if (expect instanceof JSONObject && actual instanceof JSONObject) {
37-
return custom ? selectionCustomJsonNeat(customComparator.get(abstractTravelPath), ComparatorEnum.OBJECT) : new ComplexObjectJsonNeat();
32+
return custom ? selectionCustomJsonNeat(customComparator, ComparatorEnum.OBJECT) : JsonNeatFactory.getObjectJsonNeatInstance(defaultNeat);
3833
}
3934
if (expect instanceof JSONArray && actual instanceof JSONArray) {
40-
return custom ? selectionCustomJsonNeat(customComparator.get(abstractTravelPath), ComparatorEnum.ARRAY) : new ComplexArrayJsonNeat();
35+
return custom ? selectionCustomJsonNeat(customComparator, ComparatorEnum.ARRAY) : JsonNeatFactory.getArrayJsonNeatInstance(defaultNeat);
4136
}
4237
if (ClassUtil.isPrimitiveType(expect) && ClassUtil.isPrimitiveType(actual)) {
43-
return custom ? selectionCustomJsonNeat(customComparator.get(abstractTravelPath), ComparatorEnum.PRIMITIVE) : new PrimitiveTypeJsonNeat();
38+
return custom ? selectionCustomJsonNeat(customComparator, ComparatorEnum.PRIMITIVE) : JsonNeatFactory.getPrimitiveJsonNeatInstance(defaultNeat);
4439
}
4540
return null;
4641
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package me.codeleep.jsondiff.core.utils;
2+
3+
import me.codeleep.jsondiff.common.model.neat.JsonNeat;
4+
import me.codeleep.jsondiff.core.handle.array.ComplexArrayJsonNeat;
5+
import me.codeleep.jsondiff.core.handle.object.ComplexObjectJsonNeat;
6+
import me.codeleep.jsondiff.core.handle.primitive.PrimitiveTypeJsonNeat;
7+
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
/**
12+
* @author: codeleep
13+
* @createTime: 2023/04/15 13:39
14+
* @description: 比较器工厂
15+
*/
16+
public class JsonNeatFactory {
17+
18+
/**
19+
* 对象默认比较器
20+
*/
21+
private static Class<? extends JsonNeat> objectJsonNeat = ComplexObjectJsonNeat.class;
22+
23+
/**
24+
* 数组默认比较器
25+
*/
26+
private static Class<? extends JsonNeat> arrayJsonNeat = ComplexArrayJsonNeat.class;
27+
28+
/**
29+
* 基本类型默认比较器
30+
*/
31+
private static Class<? extends JsonNeat> primitiveJsonNeat = PrimitiveTypeJsonNeat.class;
32+
33+
/**
34+
* 指定的path使用自定义比较器
35+
* key: 与ignorePath格式一致
36+
* value: 继承 AbstractArrayJsonNeat,AbstractObjectJsonNeat,AbstractPrimitiveJsonNeat. 并且实现对应格式接口的字节码
37+
*/
38+
private static final Map<String, Class<? extends JsonNeat>> customComparator = new HashMap<>();
39+
40+
41+
42+
public static Class<? extends JsonNeat> getObjectJsonNeat(boolean defaultNeat) {
43+
if (defaultNeat) {
44+
return ComplexObjectJsonNeat.class;
45+
}
46+
return objectJsonNeat;
47+
}
48+
49+
public static JsonNeat getObjectJsonNeatInstance(boolean defaultNeat) {
50+
return ClassUtil.getClassNameInstance(getObjectJsonNeat(defaultNeat));
51+
}
52+
53+
public static void setObjectJsonNeat(Class<? extends JsonNeat> objectJsonNeat) {
54+
JsonNeatFactory.objectJsonNeat = objectJsonNeat;
55+
}
56+
57+
public static Class<? extends JsonNeat> getArrayJsonNeat(boolean defaultNeat) {
58+
if (defaultNeat) {
59+
return ComplexArrayJsonNeat.class;
60+
}
61+
return arrayJsonNeat;
62+
}
63+
64+
public static JsonNeat getArrayJsonNeatInstance(boolean defaultNeat) {
65+
return ClassUtil.getClassNameInstance(getArrayJsonNeat(defaultNeat));
66+
}
67+
68+
public static void setArrayJsonNeat(Class<? extends JsonNeat> arrayJsonNeat) {
69+
JsonNeatFactory.arrayJsonNeat = arrayJsonNeat;
70+
}
71+
72+
public static Class<? extends JsonNeat> getPrimitiveJsonNeat(boolean defaultNeat) {
73+
if (defaultNeat) {
74+
return PrimitiveTypeJsonNeat.class;
75+
}
76+
return primitiveJsonNeat;
77+
}
78+
79+
public static JsonNeat getPrimitiveJsonNeatInstance(boolean defaultNeat) {
80+
return ClassUtil.getClassNameInstance(getPrimitiveJsonNeat(defaultNeat));
81+
}
82+
83+
public static void setPrimitiveJsonNeat(Class<? extends JsonNeat> primitiveJsonNeat) {
84+
JsonNeatFactory.primitiveJsonNeat = primitiveJsonNeat;
85+
}
86+
87+
public static Class<? extends JsonNeat> getCustomComparator(String path) {
88+
return customComparator.get(path);
89+
}
90+
91+
public static void addCustomComparator(String path, Class<? extends JsonNeat> customComparator) {
92+
JsonNeatFactory.customComparator.put(path, customComparator);
93+
}
94+
95+
}

0 commit comments

Comments
 (0)