From 388b753fb691351c5633bdf313a6376051319de3 Mon Sep 17 00:00:00 2001 From: Gen Wang Date: Fri, 22 Mar 2024 15:49:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E7=9A=84=E6=AF=94=E8=BE=83=E9=85=8D=E7=BD=AE,=20=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E8=80=81=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/model/JsonComparedOption.java | 27 ++++++++++-- .../jsondiff/core/utils/JsonDiffUtil.java | 8 +++- .../jsondiff/core/utils/JsonNeatFactory.java | 15 ++++++- .../test/model/GlobalCustomerComparator.java | 28 ++++++++++++ .../model/SeparateCustomerComparator.java | 30 +++++++++++++ .../jsondiff/test/simple/TemporaryTest.java | 44 +++++++++++++++++++ 6 files changed, 147 insertions(+), 5 deletions(-) create mode 100644 json-diff-test/src/main/java/me/codeleep/jsondiff/test/model/GlobalCustomerComparator.java create mode 100644 json-diff-test/src/main/java/me/codeleep/jsondiff/test/model/SeparateCustomerComparator.java diff --git a/json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/JsonComparedOption.java b/json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/JsonComparedOption.java index 0ba7ac61333..97fd132ea70 100644 --- a/json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/JsonComparedOption.java +++ b/json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/JsonComparedOption.java @@ -1,5 +1,7 @@ package me.codeleep.jsondiff.common.model; +import me.codeleep.jsondiff.common.model.neat.JsonNeat; + import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -7,7 +9,7 @@ import java.util.Map; /** * @author: codeleep * @createTime: 2022/07/30 17:00 - * @description: 对比配置 + * @description: 对比配置, 以及所有的自定义比较器配置, 该类支持全局以及独立的业务比较配置 */ public class JsonComparedOption { @@ -32,6 +34,13 @@ public class JsonComparedOption { */ private HashSet ignoreKey; + /** + * 指定的path使用自定义比较器 + * key: 与ignorePath格式一致 + * value: 继承 AbstractArrayJsonNeat,AbstractObjectJsonNeat,AbstractPrimitiveJsonNeat. 并且实现对应格式接口的字节码 + */ + private final Map> customComparator = new HashMap<>(); + /** * 强制使用系统默认比较器 */ @@ -46,7 +55,6 @@ public class JsonComparedOption { return this; } - public JsonComparedOption setMapping(Map mapping) { this.mapping = mapping; return this; @@ -68,7 +76,7 @@ public class JsonComparedOption { public Map getMapping() { if (mapping == null) { - mapping = new HashMap<>(); + mapping = new HashMap<>(16); } return mapping; } @@ -87,6 +95,19 @@ public class JsonComparedOption { return ignoreKey; } + public Class getCustomComparator(String path) { + return customComparator.get(path); + } + + public JsonComparedOption addCustomComparator(String path, Class customComparator) { + this.customComparator.put(path, customComparator); + return this; + } + + public void removeCustomComparator(String path, Class customComparator) { + this.customComparator.remove(path); + } + public boolean isMandatoryDefaultNeat() { return mandatoryDefaultNeat; } diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonDiffUtil.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonDiffUtil.java index 5841f844a00..cc1d79b2839 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonDiffUtil.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonDiffUtil.java @@ -27,7 +27,13 @@ public class JsonDiffUtil { return null; } boolean defaultNeat = RunTimeDataFactory.getOptionInstance().isMandatoryDefaultNeat(); - Class customComparator = JsonDiffOption.getJsonNeatFactory().getCustomComparator(travelPath.getAbstractTravelPath()); + Class oldCustomComparator = JsonDiffOption + .getJsonNeatFactory() + .getCustomComparator(travelPath.getAbstractTravelPath()); + // 兼容老的自定义比较器 + Class customComparator = oldCustomComparator == null ? RunTimeDataFactory + .getOptionInstance() + .getCustomComparator(travelPath.getAbstractTravelPath()) : oldCustomComparator; boolean custom = customComparator != null; // 返回系统默认处理器 if (expect instanceof JSONObject && actual instanceof JSONObject) { diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonNeatFactory.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonNeatFactory.java index 08453fafd64..e4587bf84a4 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonNeatFactory.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonNeatFactory.java @@ -34,11 +34,12 @@ public class JsonNeatFactory { * 指定的path使用自定义比较器 * key: 与ignorePath格式一致 * value: 继承 AbstractArrayJsonNeat,AbstractObjectJsonNeat,AbstractPrimitiveJsonNeat. 并且实现对应格式接口的字节码 + * 后续将不再该类中维护, 请使用: {me.codeleep.jsondiff.common.JsonComparedOption} */ + @Deprecated private final Map> customComparator = new HashMap<>(); - public Class getObjectJsonNeat(boolean defaultNeat) { if (defaultNeat) { return ComplexObjectJsonNeat.class; @@ -84,10 +85,22 @@ public class JsonNeatFactory { this.primitiveJsonNeat = primitiveJsonNeat; } + /** + * 获取比较器, 过期方法, 请使用: {me.codeleep.jsondiff.common.JsonComparedOption#getCustomComparator} + * @param path 自定义路径 + * @return 自定义比较器 + */ + @Deprecated public Class getCustomComparator(String path) { return customComparator.get(path); } + /** + * 添加自定义比较器, 过期方法, 请使用: {me.codeleep.jsondiff.common.JsonComparedOption#addCustomComparator} + * @param path 自定义路径 + * @param customComparator 自定义比较器 + */ + @Deprecated public void addCustomComparator(String path, Class customComparator) { this.customComparator.put(path, customComparator); } diff --git a/json-diff-test/src/main/java/me/codeleep/jsondiff/test/model/GlobalCustomerComparator.java b/json-diff-test/src/main/java/me/codeleep/jsondiff/test/model/GlobalCustomerComparator.java new file mode 100644 index 00000000000..dcfae7e58ea --- /dev/null +++ b/json-diff-test/src/main/java/me/codeleep/jsondiff/test/model/GlobalCustomerComparator.java @@ -0,0 +1,28 @@ +package me.codeleep.jsondiff.test.model; + +import cn.hutool.core.collection.ListUtil; +import me.codeleep.jsondiff.common.model.Defects; +import me.codeleep.jsondiff.common.model.JsonCompareResult; +import me.codeleep.jsondiff.core.handle.primitive.AbstractPrimitiveJsonNeat; + + +/** + * @author Kechen + */ +public class GlobalCustomerComparator extends AbstractPrimitiveJsonNeat { + + public final static String ILLUSTRATE_MSG = "Use global customer object comparator"; + + private final JsonCompareResult result = new JsonCompareResult(); + + @Override + public JsonCompareResult detectDiff(Object expect, Object actual) { + // pre-check + if (!check(expect, actual, result, travelPath)) { + return result; + } + result.setDefectsList(ListUtil.of(new Defects().setIllustrate(ILLUSTRATE_MSG))); + result.setMatch(false); + return result; + } +} diff --git a/json-diff-test/src/main/java/me/codeleep/jsondiff/test/model/SeparateCustomerComparator.java b/json-diff-test/src/main/java/me/codeleep/jsondiff/test/model/SeparateCustomerComparator.java new file mode 100644 index 00000000000..d350078f6fc --- /dev/null +++ b/json-diff-test/src/main/java/me/codeleep/jsondiff/test/model/SeparateCustomerComparator.java @@ -0,0 +1,30 @@ +package me.codeleep.jsondiff.test.model; + +import cn.hutool.core.collection.ListUtil; +import me.codeleep.jsondiff.common.model.Defects; +import me.codeleep.jsondiff.common.model.JsonCompareResult; +import me.codeleep.jsondiff.core.handle.primitive.AbstractPrimitiveJsonNeat; + + +/** + * @author Kechen + */ +public class SeparateCustomerComparator extends AbstractPrimitiveJsonNeat { + + public final static String ILLUSTRATE_MSG = "Use separate customer primitive comparator"; + + private final JsonCompareResult result = new JsonCompareResult(); + + @Override + public JsonCompareResult detectDiff(Object expect, Object actual) { + // pre-check + if (!check(expect, actual, result, travelPath)) { + return result; + } + result.setDefectsList(ListUtil.of(new Defects().setIllustrate(ILLUSTRATE_MSG))); + result.setMatch(false); + return result; + } + + +} diff --git a/json-diff-test/src/main/java/me/codeleep/jsondiff/test/simple/TemporaryTest.java b/json-diff-test/src/main/java/me/codeleep/jsondiff/test/simple/TemporaryTest.java index ce8c55464eb..95df18317c0 100644 --- a/json-diff-test/src/main/java/me/codeleep/jsondiff/test/simple/TemporaryTest.java +++ b/json-diff-test/src/main/java/me/codeleep/jsondiff/test/simple/TemporaryTest.java @@ -5,6 +5,10 @@ import com.alibaba.fastjson2.JSONObject; import me.codeleep.jsondiff.common.model.JsonCompareResult; import me.codeleep.jsondiff.common.model.JsonComparedOption; import me.codeleep.jsondiff.core.DefaultJsonDifference; +import me.codeleep.jsondiff.core.config.JsonDiffOption; +import me.codeleep.jsondiff.test.model.GlobalCustomerComparator; +import me.codeleep.jsondiff.test.model.SeparateCustomerComparator; +import org.testng.Assert; import org.testng.annotations.Test; /** @@ -48,4 +52,44 @@ public class TemporaryTest { } + @Test(description = "2024-03-22 新增全局与独立对比属性隔离配置,要求: 1.全局与独立互不影响 2.兼容老版本") + public void globalOrSeparateComparatorConfigShouldWorked() { + String str = "{\"a\":\"a\",\"b\":\"b\",\"c\":[{\"aa\":\"aa\"},{\"bb\":\"bb\"},{\"cc\":\"cc\"}]}"; + String str2 = "{\"b\":\"b\",\"a\":\"a\",\"c\":[{\"bb\":\"bb\"},{\"aa\":\"aa\"},{\"cc\":\"cc\"}]}"; + + String path = "root.a"; + + JsonComparedOption separateJsonComparedOption = new JsonComparedOption() + .setIgnoreOrder(true) + .addCustomComparator(path, SeparateCustomerComparator.class); + + JsonCompareResult jsonCompareResult1 = new DefaultJsonDifference().option(separateJsonComparedOption) + .detectDiff(JSON.parseObject(str), JSON.parseObject(str2)); + System.out.println(JSONObject.toJSONString(jsonCompareResult1)); + Assert.assertTrue(JSONObject.toJSONString(jsonCompareResult1).contains(SeparateCustomerComparator.ILLUSTRATE_MSG)); + + JsonComparedOption globalJsonComparedOption = new JsonComparedOption() + .setIgnoreOrder(true) + .addCustomComparator(path, GlobalCustomerComparator.class); + + JsonDiffOption.openUniqueOption(); + JsonDiffOption.setGloballyUniqueOption(globalJsonComparedOption); + JsonCompareResult jsonCompareResult2 = new DefaultJsonDifference() + .detectDiff(JSON.parseObject(str), JSON.parseObject(str2)); + System.out.println(JSONObject.toJSONString(jsonCompareResult2)); + Assert.assertTrue(JSONObject.toJSONString(jsonCompareResult2).contains(GlobalCustomerComparator.ILLUSTRATE_MSG)); + + // 兼容老版本测试 + JsonComparedOption oldVersionJsonComparedOption = new JsonComparedOption() + .setIgnoreOrder(true); + JsonDiffOption.getJsonNeatFactory().addCustomComparator(path, SeparateCustomerComparator.class); + JsonCompareResult jsonCompareResult3 = new DefaultJsonDifference().option(oldVersionJsonComparedOption) + .detectDiff(JSON.parseObject(str), JSON.parseObject(str2)); + System.out.println(JSONObject.toJSONString(jsonCompareResult3)); + Assert.assertTrue(JSONObject.toJSONString(jsonCompareResult3).contains(SeparateCustomerComparator.ILLUSTRATE_MSG)); + + } + + + } -- Gitee From c5860639fec4e57426079e0955de1d9d48090129 Mon Sep 17 00:00:00 2001 From: Gen Wang Date: Fri, 22 Mar 2024 16:18:20 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/codeleep/jsondiff/core/utils/JsonNeatFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonNeatFactory.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonNeatFactory.java index e4587bf84a4..3ce6b12cd56 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonNeatFactory.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/utils/JsonNeatFactory.java @@ -34,7 +34,7 @@ public class JsonNeatFactory { * 指定的path使用自定义比较器 * key: 与ignorePath格式一致 * value: 继承 AbstractArrayJsonNeat,AbstractObjectJsonNeat,AbstractPrimitiveJsonNeat. 并且实现对应格式接口的字节码 - * 后续将不再该类中维护, 请使用: {me.codeleep.jsondiff.common.JsonComparedOption} + * 后续将不在该类中维护, 请使用: {me.codeleep.jsondiff.common.JsonComparedOption#customComparator} */ @Deprecated private final Map> customComparator = new HashMap<>(); -- Gitee