diff --git a/Readme.md b/Readme.md index 72680bf..2b397f3 100644 --- a/Readme.md +++ b/Readme.md @@ -20,7 +20,14 @@ - 高效的 - 精准定位差异 - 轻量级 -- 依赖非常干净,只依赖fastJson +- 依赖非常干净,只依赖fastJson,fastjson2,gson,jackson其中之一 + +目前支持功能 + + - [x] 支持json-path表示路径 + - [x] 支持配置化比较行为。详情见下文 + - [x] 支持拓展自定义比较器,用于满足特殊需求 + - [x] 支持不同json框架选择。 @@ -39,9 +46,16 @@ ${version} + + + + cn.xiaoandcai + json-diff-impl-fastjson + ${version} + ``` [版本查看](./VersionHistory.md) -2024-04-11 最新版本:4.0.6-RC1-RELEASE +2024-04-11 最新版本:4.1.1-RC1-RELEASE ```java /** @@ -99,10 +113,7 @@ public class UseExample { 工具提供了四个配置,来之对比过程中一些其他的要求。工具还在积极开发中,如果有新的需求,可以给作者提一个issuse。 -在开发中。很多时候对比配置一致。可以使用 `JsonDiffOption` 进行开启唯一配置。这样也将获取更好的性能; -```java - -``` +在开发中。很多时候对比配置一致。可以使用 `JsonDiffOption` 进行开启唯一配置。这样也将获取更好的性能 ### 3.进阶 diff --git a/json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/TravelPath.java b/json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/TravelPath.java index 6e17058..d035b19 100644 --- a/json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/TravelPath.java +++ b/json-diff-common/src/main/java/me/codeleep/jsondiff/common/model/TravelPath.java @@ -31,13 +31,13 @@ public TravelPath(TravelPath parentPath, MappingKey mappingKey) { // 抽象的路径 this.abstractTravelPath = PathUtil.getObjectPath(parentPath.getAbstractTravelPath()) + (mappingKey.getExpectKey() != null ? mappingKey.getExpectKey() : mappingKey.getActualKey()); // 实际遍历的路径 - this.actualTravelPath = PathUtil.getObjectPath(parentPath.actualTravelPath) + mappingKey.getActualKey(); + this.actualTravelPath = PathUtil.getObjectPath(parentPath.getActualTravelPath()) + mappingKey.getActualKey(); this.expectTravelPath = PathUtil.getObjectPath(parentPath.getExpectTravelPath()) + mappingKey.getExpectKey(); } public TravelPath(TravelPath parentPath, int expectIndex, int actualIndex) { // 抽象的路径 - this.abstractTravelPath = parentPath.getAbstractTravelPath() + PathUtil.getIndexPath("*"); + this.abstractTravelPath = parentPath.getAbstractTravelPath() + PathUtil.getAbstractIndexPath(null); // 实际遍历的路径 this.actualTravelPath = parentPath.getActualTravelPath() + PathUtil.getIndexPath(String.valueOf(actualIndex)); this.expectTravelPath = parentPath.getExpectTravelPath() + PathUtil.getIndexPath(String.valueOf(expectIndex)); diff --git a/json-diff-common/src/main/java/me/codeleep/jsondiff/common/utils/PathUtil.java b/json-diff-common/src/main/java/me/codeleep/jsondiff/common/utils/PathUtil.java index 4996e5c..745e8db 100644 --- a/json-diff-common/src/main/java/me/codeleep/jsondiff/common/utils/PathUtil.java +++ b/json-diff-common/src/main/java/me/codeleep/jsondiff/common/utils/PathUtil.java @@ -14,12 +14,16 @@ public class PathUtil { private static final String ARRAY_SING_RIGHT = "]"; + public static String getAbstractIndexPath(String index) { + return ARRAY_SING_LEFT + "*" + ARRAY_SING_RIGHT; + } + public static String getIndexPath(String index) { return ARRAY_SING_LEFT + index + ARRAY_SING_RIGHT; } public static String getObjectPath(String parentPath) { - return parentPath.replaceAll("\\[\\d+]", "[*]") + OBJECT_SING; + return parentPath + OBJECT_SING; } } diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/AbstractHandleFactory.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/AbstractHandleFactory.java index 7119d82..3228351 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/AbstractHandleFactory.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/AbstractHandleFactory.java @@ -18,20 +18,20 @@ */ public class AbstractHandleFactory implements HandleFactory{ @Override - public JsonNeat generate(JsonDiff actual, JsonDiff expect, TravelPath travelPath) { + public JsonNeat generate(JsonDiff expect, JsonDiff actual, TravelPath travelPath) { if (!ClassUtil.isSameClass(expect, actual)) { return null; } // TODO 返回系统默认处理器 if (expect instanceof JsonDiffObject && actual instanceof JsonDiffObject) { - return new ComplexObjectJsonNeat(travelPath, actual, expect); + return new ComplexObjectJsonNeat(travelPath, expect, actual); } if (expect instanceof JsonDiffArray && actual instanceof JsonDiffArray) { - return new ComplexArrayJsonNeat(travelPath, actual, expect); + return new ComplexArrayJsonNeat(travelPath, expect, actual); } if (expect.isLeaf() && actual.isLeaf()) { - return new ComplexPrimitiveJsonNeat(travelPath, actual, expect); + return new ComplexPrimitiveJsonNeat(travelPath, expect, actual); } - return new ComplexOtherJsonNeat(travelPath, actual, expect); + return new ComplexOtherJsonNeat(travelPath, expect, actual); } } diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/HandleFactory.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/HandleFactory.java index 62b04fe..7447c0e 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/HandleFactory.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/HandleFactory.java @@ -11,6 +11,6 @@ */ public interface HandleFactory { - JsonNeat generate(JsonDiff actual, JsonDiff expect, TravelPath travelPath); + JsonNeat generate(JsonDiff expect, JsonDiff actual, TravelPath travelPath); } diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/array/AbstractArrayJsonNeat.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/array/AbstractArrayJsonNeat.java index b971d69..2deb442 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/array/AbstractArrayJsonNeat.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/array/AbstractArrayJsonNeat.java @@ -19,9 +19,9 @@ public abstract class AbstractArrayJsonNeat extends Abs protected final JsonDiffArray expect; - protected AbstractArrayJsonNeat(TravelPath travelPath, JsonDiff actual, JsonDiff expect) { + protected AbstractArrayJsonNeat(TravelPath travelPath, JsonDiff expect, JsonDiff actual) { super(travelPath); - if (!(actual instanceof JsonDiffArray) || !(expect instanceof JsonDiffArray)) { + if (!(expect instanceof JsonDiffArray) || !(actual instanceof JsonDiffArray)) { throw new IllegalArgumentException("Parameter type error, actual and expect must be JsonDiffArray"); } this.actual = (JsonDiffArray) actual; diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/array/ComplexArrayJsonNeat.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/array/ComplexArrayJsonNeat.java index f6e2b01..b359f5d 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/array/ComplexArrayJsonNeat.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/array/ComplexArrayJsonNeat.java @@ -19,8 +19,8 @@ */ public class ComplexArrayJsonNeat extends AbstractArrayJsonNeat { - public ComplexArrayJsonNeat(TravelPath travelPath, JsonDiff actual, JsonDiff expect) { - super(travelPath, actual, expect); + public ComplexArrayJsonNeat(TravelPath travelPath, JsonDiff expect, JsonDiff actual) { + super(travelPath, expect, actual); } protected JsonCompareResult ignoreOrder(JsonDiffArray expect, JsonDiffArray actual) { @@ -39,7 +39,7 @@ protected JsonCompareResult ignoreOrder(JsonDiffArray expect, JsonDiffArray actu continue; } TravelPath nextTravelPath = new TravelPath(this.travelPath, expectIndex, actualIndex); - JsonNeat jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate(actual.get(actualIndex), expect.get(expectIndex), nextTravelPath); + JsonNeat jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate( expect.get(expectIndex), actual.get(actualIndex), nextTravelPath); if (jsonNeat == null) { continue; } @@ -65,7 +65,7 @@ protected JsonCompareResult ignoreOrder(JsonDiffArray expect, JsonDiffArray actu JsonDiff actualItem = actual.get(actualIndex); TravelPath nextTravelPath = new TravelPath(this.travelPath, expectIndex, actualIndex); // 判断类型, 根据类型去实例化JsonNeat。 - JsonNeat jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate(actualItem, expectItem, nextTravelPath); + JsonNeat jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate(expectItem, actualItem, nextTravelPath); // 类型不一致 if (jsonNeat != null) { JsonCompareResult diff = jsonNeat.diff(); @@ -93,7 +93,7 @@ protected JsonCompareResult keepOrder(JsonDiffArray expect, JsonDiffArray actual JsonDiff actualItem = actual.get(i); TravelPath nextTravelPath = new TravelPath(this.travelPath, i, i); // 判断类型, 根据类型去实例化JsonNeat。 - JsonNeat jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate(actualItem, expectItem, nextTravelPath); + JsonNeat jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate(expectItem, actualItem, nextTravelPath); // 类型不一致 if (jsonNeat == null) { Defects defects = new Defects() diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/custom/AlignArrayJsonDiff.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/custom/AlignArrayJsonDiff.java index bde9fc0..83be0ad 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/custom/AlignArrayJsonDiff.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/custom/AlignArrayJsonDiff.java @@ -14,8 +14,8 @@ */ public class AlignArrayJsonDiff extends ComplexArrayJsonNeat { - protected AlignArrayJsonDiff(TravelPath travelPath, JsonDiff actual, JsonDiff expect) { - super(travelPath, actual, expect); + protected AlignArrayJsonDiff(TravelPath travelPath, JsonDiff expect, JsonDiff actual) { + super(travelPath, expect, actual); } @Override diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/object/AbstractObjectJsonNeat.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/object/AbstractObjectJsonNeat.java index fab0803..555540c 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/object/AbstractObjectJsonNeat.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/object/AbstractObjectJsonNeat.java @@ -18,9 +18,9 @@ public abstract class AbstractObjectJsonNeat extends A protected final JsonDiffObject expect; - protected AbstractObjectJsonNeat(TravelPath travelPath, JsonDiff actual, JsonDiff expect) { + protected AbstractObjectJsonNeat(TravelPath travelPath, JsonDiff expect, JsonDiff actual) { super(travelPath); - if (!(actual instanceof JsonDiffObject) || !(expect instanceof JsonDiffObject)) { + if (!(expect instanceof JsonDiffObject) || !(actual instanceof JsonDiffObject)) { throw new IllegalArgumentException("Parameter type error, actual and expect must be JsonDiffObject"); } this.actual = (JsonDiffObject) actual; diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/object/ComplexObjectJsonNeat.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/object/ComplexObjectJsonNeat.java index aa557de..578f036 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/object/ComplexObjectJsonNeat.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/object/ComplexObjectJsonNeat.java @@ -31,8 +31,8 @@ public class ComplexObjectJsonNeat extends AbstractObjectJsonNeat keyMap = new ArrayList<>(); - public ComplexObjectJsonNeat(TravelPath travelPath, JsonDiff actual, JsonDiff expect) { - super(travelPath, actual, expect); + public ComplexObjectJsonNeat(TravelPath travelPath, JsonDiff expect, JsonDiff actual) { + super(travelPath, expect, actual); } /** @@ -111,7 +111,7 @@ protected JsonCompareResult diff1() { JsonDiff actualDiffJson = actual.get(mappingKey.getActualKey()); TravelPath nextTravelPath = new TravelPath(travelPath, mappingKey); // 判断类型, 根据类型去实例化JsonNeat。 - JsonNeat jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate(actualDiffJson, expectDiffJson, nextTravelPath); + JsonNeat jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate(expectDiffJson, actualDiffJson, nextTravelPath); if (jsonNeat == null) { Defects defects = new Defects() .setActual(actualDiffJson) diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/other/AbstractOtherJsonNeat.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/other/AbstractOtherJsonNeat.java index 8aa3f0f..6411511 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/other/AbstractOtherJsonNeat.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/other/AbstractOtherJsonNeat.java @@ -20,9 +20,9 @@ public abstract class AbstractOtherJsonNeat extends Abs protected final JsonDiffOther expect; - protected AbstractOtherJsonNeat(TravelPath travelPath, JsonDiff actual, JsonDiff expect) { + protected AbstractOtherJsonNeat(TravelPath travelPath, JsonDiff expect, JsonDiff actual) { super(travelPath); - if (!(actual instanceof JsonDiffOther) || !(expect instanceof JsonDiffOther)) { + if (!(expect instanceof JsonDiffOther) || !(actual instanceof JsonDiffOther)) { throw new IllegalArgumentException("Parameter type error, actual and expect must be JsonDiffOther"); } this.actual = (JsonDiffOther) actual; diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/other/ComplexOtherJsonNeat.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/other/ComplexOtherJsonNeat.java index 075fbd5..d7621d0 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/other/ComplexOtherJsonNeat.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/other/ComplexOtherJsonNeat.java @@ -17,8 +17,8 @@ */ public class ComplexOtherJsonNeat extends AbstractOtherJsonNeat { - public ComplexOtherJsonNeat(TravelPath travelPath, JsonDiff actual, JsonDiff expect) { - super(travelPath, actual, expect); + public ComplexOtherJsonNeat(TravelPath travelPath, JsonDiff expect, JsonDiff actual) { + super(travelPath, expect, actual); } @Override diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/primitive/AbstractPrimitiveJsonNeat.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/primitive/AbstractPrimitiveJsonNeat.java index 0d09f49..3140e60 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/primitive/AbstractPrimitiveJsonNeat.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/primitive/AbstractPrimitiveJsonNeat.java @@ -4,7 +4,6 @@ import me.codeleep.jsondiff.common.model.JsonCompareResult; import me.codeleep.jsondiff.common.model.TravelPath; import me.codeleep.jsondiff.common.model.neat.JsonDiff; -import me.codeleep.jsondiff.common.model.neat.JsonDiffObject; import me.codeleep.jsondiff.common.model.neat.JsonDiffPrimitive; import me.codeleep.jsondiff.core.handle.AbstractJsonNeat; @@ -19,9 +18,9 @@ public abstract class AbstractPrimitiveJsonNeat ext protected final JsonDiffPrimitive expect; - protected AbstractPrimitiveJsonNeat(TravelPath travelPath, JsonDiff actual, JsonDiff expect) { + protected AbstractPrimitiveJsonNeat(TravelPath travelPath, JsonDiff expect, JsonDiff actual) { super(travelPath); - if (!(actual instanceof JsonDiffPrimitive) || !(expect instanceof JsonDiffPrimitive)) { + if (!(expect instanceof JsonDiffPrimitive) || !(actual instanceof JsonDiffPrimitive)) { throw new IllegalArgumentException("Parameter type error, actual and expect must be JsonDiffPrimitive"); } this.actual = (JsonDiffPrimitive) actual; diff --git a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/primitive/ComplexPrimitiveJsonNeat.java b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/primitive/ComplexPrimitiveJsonNeat.java index 68f541d..8211421 100644 --- a/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/primitive/ComplexPrimitiveJsonNeat.java +++ b/json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/primitive/ComplexPrimitiveJsonNeat.java @@ -17,8 +17,8 @@ */ public class ComplexPrimitiveJsonNeat extends AbstractPrimitiveJsonNeat { - public ComplexPrimitiveJsonNeat(TravelPath travelPath, JsonDiff actual, JsonDiff expect) { - super(travelPath, actual, expect); + public ComplexPrimitiveJsonNeat(TravelPath travelPath, JsonDiff expect, JsonDiff actual) { + super(travelPath, expect, actual); } @Override diff --git a/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonArray.java b/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonArray.java index b4a3b0d..67bef4d 100644 --- a/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonArray.java +++ b/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonArray.java @@ -1,9 +1,11 @@ package me.codeleep.jsondiff.impl.fastjson; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import me.codeleep.jsondiff.common.model.neat.JsonDiff; import me.codeleep.jsondiff.common.model.neat.JsonDiffArray; +import java.util.ArrayList; import java.util.Collection; /** @@ -47,7 +49,10 @@ public void addAll(Collection c) { @Override public Object format() { - return String.valueOf(jsonArray); + if (jsonArray == null) { + return null; + } + return jsonArray.toJSONString(); } @Override diff --git a/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonObject.java b/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonObject.java index f857e27..4d71057 100644 --- a/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonObject.java +++ b/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonObject.java @@ -5,6 +5,8 @@ import me.codeleep.jsondiff.common.model.neat.JsonDiff; import me.codeleep.jsondiff.common.model.neat.JsonDiffObject; +import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Set; @@ -39,7 +41,10 @@ public Set keySet() { @Override public Object format() { - return JSON.toJSONString(jsonObject); + if (jsonObject == null) { + return null; + } + return jsonObject.toJSONString(); } @Override diff --git a/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonOther.java b/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonOther.java index 8d5e62a..4c69b5a 100644 --- a/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonOther.java +++ b/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonOther.java @@ -34,6 +34,9 @@ public boolean isEquals(JsonDiffOther jsonDiffOther) { @Override public Object format() { + if (object == null || object instanceof String) { + return object; + } return String.valueOf(object); } diff --git a/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonPrimitive.java b/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonPrimitive.java index 5d87da7..86d8150 100644 --- a/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonPrimitive.java +++ b/json-diff-impl/json-diff-impl-fastjson/src/main/java/me/codeleep/jsondiff/impl/fastjson/FastJsonPrimitive.java @@ -29,6 +29,9 @@ public boolean isEquals(JsonDiffPrimitive jsonDiffPrimitive) { @Override public Object format() { + if (object == null || object instanceof String) { + return object; + } return String.valueOf(object); } diff --git a/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Array.java b/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Array.java index 749c031..6d484de 100644 --- a/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Array.java +++ b/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Array.java @@ -49,7 +49,10 @@ public void addAll(Collection c) { @Override public Object format() { - return JSON.to(ArrayList.class, jsonArray); + if (jsonArray == null) { + return null; + } + return jsonArray.toJSONString(); } @Override diff --git a/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Object.java b/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Object.java index 39a8a30..48c82bb 100644 --- a/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Object.java +++ b/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Object.java @@ -40,7 +40,10 @@ public Set keySet() { @Override public Object format() { - return JSON.to(HashMap.class, jsonObject); + if (this.jsonObject == null) { + return null; + } + return jsonObject.toJSONString(); } @Override diff --git a/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Other.java b/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Other.java index 81bba0e..59591db 100644 --- a/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Other.java +++ b/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Other.java @@ -35,6 +35,9 @@ public boolean isEquals(JsonDiffOther jsonDiffOther) { @Override public Object format() { + if (object == null || object instanceof String) { + return object; + } return String.valueOf(object); } diff --git a/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Primitive.java b/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Primitive.java index fc325a4..346491b 100644 --- a/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Primitive.java +++ b/json-diff-impl/json-diff-impl-fastjson2/src/main/java/me/codeleep/jsondiff/impl/fastjson2/FastJson2Primitive.java @@ -29,6 +29,9 @@ public boolean isEquals(JsonDiffPrimitive jsonDiffPrimitive) { @Override public Object format() { + if (object == null || object instanceof String) { + return object; + } return String.valueOf(object); } diff --git a/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonArray.java b/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonArray.java index 4eaadd1..4c90b6c 100644 --- a/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonArray.java +++ b/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonArray.java @@ -65,7 +65,10 @@ public void addAll(Collection cs) { @Override public Object format() { - return gson.fromJson(jsonArray, ArrayList.class); + if (jsonArray == null) { + return null; + } + return gson.toJson(jsonArray); } @Override diff --git a/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonObject.java b/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonObject.java index a9c4051..8f74604 100644 --- a/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonObject.java +++ b/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonObject.java @@ -54,7 +54,10 @@ public Set keySet() { @Override public Object format() { - return gson.fromJson(jsonObject, HashMap.class); + if (jsonObject == null) { + return null; + } + return gson.toJson(jsonObject); } @Override diff --git a/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonOther.java b/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonOther.java index feeefc4..1492bb7 100644 --- a/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonOther.java +++ b/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonOther.java @@ -1,5 +1,6 @@ package me.codeleep.jsondiff.impl.gson; +import com.google.gson.JsonPrimitive; import me.codeleep.jsondiff.common.model.neat.JsonDiffOther; /** @@ -17,6 +18,12 @@ public GsonOther(Object object) { @Override public Object format() { + if (object == null || object instanceof String) { + return object; + } + if (object instanceof JsonPrimitive) { + return ((JsonPrimitive) object).getAsString(); + } return String.valueOf(object); } diff --git a/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonPrimitive.java b/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonPrimitive.java index b029f18..fae883e 100644 --- a/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonPrimitive.java +++ b/json-diff-impl/json-diff-impl-gson/src/main/java/me/codeleep/jsondiff/impl/gson/GsonPrimitive.java @@ -1,5 +1,6 @@ package me.codeleep.jsondiff.impl.gson; +import com.google.gson.JsonPrimitive; import me.codeleep.jsondiff.common.model.neat.JsonDiffPrimitive; /** @@ -17,6 +18,12 @@ public GsonPrimitive(Object object) { @Override public Object format() { + if (object == null || object instanceof String) { + return object; + } + if (object instanceof JsonPrimitive) { + return ((JsonPrimitive) object).getAsString(); + } return String.valueOf(object); } diff --git a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonArray.java b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonArray.java index 0d28eee..987f64c 100644 --- a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonArray.java +++ b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonArray.java @@ -1,5 +1,6 @@ package me.codeleep.jsondiff.impl.jackson; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -57,7 +58,14 @@ public void addAll(Collection cs) { @Override public Object format() { - return mapper.convertValue(jsonArray, ArrayList.class); + if (jsonArray == null) { + return null; + } + try { + return mapper.writeValueAsString(jsonArray); + } catch (JsonProcessingException e) { + return null; + } } @Override diff --git a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonObject.java b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonObject.java index 9e3b1c6..93f8d54 100644 --- a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonObject.java +++ b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonObject.java @@ -1,5 +1,6 @@ package me.codeleep.jsondiff.impl.jackson; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import me.codeleep.jsondiff.common.model.neat.JsonDiff; @@ -42,7 +43,14 @@ public Set keySet() { @Override public Object format() { - return mapper.convertValue(jsonObject, HashMap.class); + if (jsonObject == null) { + return null; + } + try { + return mapper.writeValueAsString(jsonObject); + } catch (JsonProcessingException e) { + return null; + } } @Override diff --git a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonOther.java b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonOther.java index 01edda6..0232e56 100644 --- a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonOther.java +++ b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonOther.java @@ -1,5 +1,6 @@ package me.codeleep.jsondiff.impl.jackson; +import com.fasterxml.jackson.databind.JsonNode; import me.codeleep.jsondiff.common.model.neat.JsonDiffOther; /** @@ -17,6 +18,12 @@ public JacksonOther(Object object) { @Override public Object format() { + if (object == null || object instanceof String) { + return object; + } + if (object instanceof JsonNode) { + return ((JsonNode)this.object).asText(); + } return String.valueOf(object); } diff --git a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonPrimitive.java b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonPrimitive.java index 9be72e6..d142501 100644 --- a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonPrimitive.java +++ b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonPrimitive.java @@ -1,5 +1,6 @@ package me.codeleep.jsondiff.impl.jackson; +import com.fasterxml.jackson.databind.JsonNode; import me.codeleep.jsondiff.common.model.neat.JsonDiffPrimitive; /** @@ -17,6 +18,12 @@ public JacksonPrimitive(Object object) { @Override public Object format() { + if (object == null || object instanceof String) { + return object; + } + if (object instanceof JsonNode) { + return ((JsonNode)this.object).asText(); + } return String.valueOf(object); } diff --git a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonUtil.java b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonUtil.java index 4c67868..83b152c 100644 --- a/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonUtil.java +++ b/json-diff-impl/json-diff-impl-jackson/src/main/java/me/codeleep/jsondiff/impl/jackson/JacksonUtil.java @@ -18,7 +18,7 @@ public static JsonDiff formatJsonDiff(Object value) { return new JacksonArray((ArrayNode) value); } if (isJackPrimitive(value)) { - return new JacksonOther(value); + return new JacksonPrimitive(value); } return new JacksonOther(value); } diff --git a/json-diff-test/pom.xml b/json-diff-test/pom.xml index 1707f61..1a81135 100644 --- a/json-diff-test/pom.xml +++ b/json-diff-test/pom.xml @@ -26,7 +26,7 @@ cn.xiaoandcai - json-diff-impl-gson + json-diff-impl-jackson ${project.version} compile diff --git a/json-diff-test/src/main/java/me/codeleep/jsondiff/test/SimpleTest.java b/json-diff-test/src/main/java/me/codeleep/jsondiff/test/SimpleTest.java new file mode 100644 index 0000000..0d7321d --- /dev/null +++ b/json-diff-test/src/main/java/me/codeleep/jsondiff/test/SimpleTest.java @@ -0,0 +1,32 @@ +package me.codeleep.jsondiff.test; + +import com.alibaba.fastjson2.JSON; +import me.codeleep.jsondiff.DefaultJsonDifference; +import me.codeleep.jsondiff.common.model.JsonCompareResult; +import me.codeleep.jsondiff.core.config.JsonComparedOption; +import org.testng.annotations.Test; + +import java.util.HashSet; + +/** + * @author: codeleep + * @createTime: 2024/04/12 上午10:22 + * @description: + */ +public class SimpleTest { + + @Test + public void test1() { + String expect = "{\"name\":\"baron\",\"age\":12}"; + String actual = "{\"name\":\"baron\"}"; + + HashSet ignorePath = new HashSet<>(); + ignorePath.add("$.age"); + + JsonComparedOption jsonComparedOption = new JsonComparedOption().setIgnoreOrder(true).setIgnorePath(ignorePath); + JsonCompareResult jsonCompareResult = new DefaultJsonDifference() + .option(jsonComparedOption) + .detectDiff(expect, actual); + System.out.printf(JSON.toJSONString(jsonCompareResult)); + } +}