Skip to content
Merged
12 changes: 6 additions & 6 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,12 @@ public class UseExample {

### 2.配置

| 配置 | 类型 | 备注 |
| ---------------- | ------------------------------ | ------------------------------------------------------------ |
| ignoreOrder | boolean | 是否比较过程中忽略数组顺序 |
| mapping | Map<String, String> | 将真实字段映射到期望字段,key是真实字段name,value是期望的字段name |
| ignorePath | Set\<String\> | 当对比的路径完全匹配时会被跳过。遇到数组使用 `[]` 即可。无需填入下标 |
| ignoreKey | Set\<String\> | 对比object时。或忽略该key。对整个json生效 |
| 配置 | 类型 | 备注 |
| ---------------- | ------------------------------ |------------------------------------------------------------------------|
| ignoreOrder | boolean | 是否比较过程中忽略数组顺序 |
| mapping | Map<String, String> | 将真实字段映射到期望字段,key是真实字段name,value是期望的字段name.当真实字段和期望的字段对应的key都存在时,该配置才生效 |
| ignorePath | Set\<String\> | 当对比的路径完全匹配时会被跳过。标准的json-path |
| ignoreKey | Set\<String\> | 对比object时。或忽略该key。对整个json生效 |

> 在 `2.0.1-RC1-RELEASE` 之后版本中移除了 `keyFunction` 配置参数。可以使用 `ignorePath` 来代替达到同样的效果。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ protected JsonCompareResult ignoreOrder(JsonDiffArray expect, JsonDiffArray actu
continue;
}
TravelPath nextTravelPath = new TravelPath(this.travelPath, expectIndex, actualIndex);
JsonNeat<? extends JsonDiff> jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate( expect.get(expectIndex), actual.get(actualIndex), nextTravelPath);
JsonNeat<? extends JsonDiff> jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate(expect.get(expectIndex), actual.get(actualIndex), nextTravelPath);
if (jsonNeat == null) {
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,21 @@ private void keySetConversion(Set<String> expectKeys, Set<String> actualKeys) {
// 移除忽略的Path
HashSet<String> ignorePath = RunTimeDataFactory.getOptionInstance().getIgnorePath();
List<MappingKey> mappingKeys = keyMap.stream().filter(mappingKey -> {
String actualTravelPath = PathUtil.getObjectPath(travelPath.getActualTravelPath()) + mappingKey.getActualKey();
String expectTravelPath = PathUtil.getObjectPath(travelPath.getExpectTravelPath()) + mappingKey.getExpectKey();
if (ignorePath.contains(actualTravelPath) || ignorePath.contains(expectTravelPath) ) {
return false;
String actualKey = mappingKey.getActualKey();
if (actualKey != null) {
String actualTravelPath = PathUtil.getObjectPath(travelPath.getActualTravelPath()) + mappingKey.getActualKey();
String abstractActualTravelPath = PathUtil.getObjectPath(travelPath.getAbstractTravelPath()) + mappingKey.getActualKey();
if (ignorePath.contains(actualTravelPath) || ignorePath.contains(abstractActualTravelPath)) {
return false;
}
}
String expectKey = mappingKey.getExpectKey();
if (expectKey != null) {
String expectTravelPath = PathUtil.getObjectPath(travelPath.getExpectTravelPath()) + mappingKey.getExpectKey();
String abstractExpectTravelPath = PathUtil.getObjectPath(travelPath.getAbstractTravelPath()) + mappingKey.getExpectKey();
if (ignorePath.contains(expectTravelPath) || ignorePath.contains(abstractExpectTravelPath)) {
return false;
}
}
return true;
}).collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,15 @@ protected JsonCompareResult diff1() {
result.addDefects(defects);
return result;
}
if (!ClassUtil.isSameClass(expect.getOther(), actual.getOther())) {
Defects defects = new Defects()
.setActual(actual)
.setExpect(expect)
.setTravelPath(travelPath)
.setIllustrateTemplate(DATA_TYPE_INCONSISTENT, ClassUtil.getClassName(expect.getOther()), ClassUtil.getClassName(actual.getOther()));
result.addDefects(defects);
return result;
}
if (expect.isEquals(actual)) {
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,15 @@ protected JsonCompareResult diff1() {
result.addDefects(defects);
return result;
}
if (!ClassUtil.isSameClass(expect.getTarget(), actual.getTarget())) {
Defects defects = new Defects()
.setActual(actual)
.setExpect(expect)
.setTravelPath(travelPath)
.setIllustrateTemplate(DATA_TYPE_INCONSISTENT, ClassUtil.getClassName(expect.getTarget()), ClassUtil.getClassName(actual.getTarget()));
result.addDefects(defects);
return result;
}
if (expect.isEquals(actual)) {
return result;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package me.codeleep.jsondiff.core.utils;

import me.codeleep.jsondiff.common.exception.JsonDiffException;
import me.codeleep.jsondiff.common.model.neat.JsonDiffArray;
import me.codeleep.jsondiff.common.model.neat.JsonDiffObject;

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

/**
Expand All @@ -26,33 +22,6 @@ public static boolean isSameClass(Object obj1, Object obj2) {
return obj1 == null && obj2 == null;
}

/**
* 判断当前对象是否为json数据格式中的基本类型
* @param obj 判断的对象
* @return 是否为基本类型
*/
public static boolean isPrimitiveType(Object obj){
if(obj == null){
return true;
}

if(obj instanceof JsonDiffArray || obj instanceof JsonDiffObject){
return false;
}

if (String.class.isAssignableFrom(obj.getClass())) {
return true;
}
if (obj instanceof Number) {
return true;
}
try {
return ((Class<?>)obj.getClass().getField("TYPE").get(null)).isPrimitive();
} catch (Exception e) {
return false;
}
}


/**
* 获取className
Expand All @@ -65,12 +34,4 @@ public static String getClassName(Object obj) {
}
return obj.getClass().getName();
}

public static <T> T getClassNameInstance(Class<T> clazz) {
try {
return clazz.newInstance();
} catch (Exception e) {
throw new JsonDiffException(String.format("无法实例化: %s", clazz), e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,65 +5,68 @@
import me.codeleep.jsondiff.common.model.JsonCompareResult;
import me.codeleep.jsondiff.test.model.MetaData;
import me.codeleep.jsondiff.test.dataFactory.ArrayDataFactory;
import me.codeleep.jsondiff.test.utils.FormatContent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.Test;

/**
* @author: chenfeng
* @createTime: 2023/3/2 21:55
* @description: 数组类型的测试类
*/
public class MultAllArrayTest {
private static final Logger logger = LoggerFactory.getLogger(MultAllArrayTest.class);
private static final Logger logger = LoggerFactory.getLogger(MultAllArrayTest.class);
private final DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();

@Test(dataProvider = "right", dataProviderClass = ArrayDataFactory.class)
public void noOptionRightTest(MetaData metaData) {
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
logger.info(metaData.getCaseName());
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString());
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString());
JsonCompareResult jsonCompareResult = defaultJsonDifference
.detectDiff(JSON.toJSONString(metaData.getExpect()) , JSON.toJSONString(metaData.getActual()));
if (metaData.getRet() != null)
{ Assert.assertEquals( JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));}
else
{ Assert.assertEquals( JSON.toJSONString(jsonCompareResult),"{\"match\":true}");}
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
if (metaData.getRet() != null) {
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
} else {
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
}
}

@Test(dataProvider = "err", dataProviderClass = ArrayDataFactory.class)
public void noOptionErrTest(MetaData metaData) {
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
logger.info(metaData.getCaseName());
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n"+metaData.getOption());
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n" + metaData.getOption());
JsonCompareResult jsonCompareResult = defaultJsonDifference
.detectDiff(JSON.toJSONString(metaData.getExpect()) , JSON.toJSONString(metaData.getActual()));
Assert.assertEquals(JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));

.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
}

@Test(dataProvider = "optionRight", dataProviderClass = ArrayDataFactory.class)
public void optionRight(MetaData metaData) {
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
logger.info(metaData.getCaseName());
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n");
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n");
JsonCompareResult jsonCompareResult = defaultJsonDifference
.option(metaData.getOption())
.detectDiff(JSON.toJSONString(metaData.getExpect()) , JSON.toJSONString(metaData.getActual()));
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
if (metaData.getRet() != null) {
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), JSON.toJSONString(metaData.getRet()));
}
else {
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), "{\"match\":true}");
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
} else {
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
}
}

@Test(dataProvider = "optionErr", dataProviderClass = ArrayDataFactory.class)
public void optionErr(MetaData metaData) {
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
logger.info(metaData.getCaseName());
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n");
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n");
JsonCompareResult jsonCompareResult = defaultJsonDifference
.option(metaData.getOption())
.detectDiff(JSON.toJSONString(metaData.getExpect()) , JSON.toJSONString(metaData.getActual()));
Assert.assertEquals(JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
if (metaData.getRet() != null) {
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
} else {
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import me.codeleep.jsondiff.DefaultJsonDifference;
import me.codeleep.jsondiff.test.dataFactory.ObjectDataFactory;
import me.codeleep.jsondiff.test.model.MetaData;
import me.codeleep.jsondiff.test.utils.FormatContent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
Expand All @@ -22,52 +23,49 @@ public class MultAllObjectTest {
public void noOptionRightTest(MetaData metaData) {
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
logger.info(metaData.getCaseName());
logger.debug(metaData.getExpect().toString()+"\n"+metaData.getActual().toString());
logger.debug(metaData.getExpect().toString() + "\n" + metaData.getActual().toString());
JsonCompareResult jsonCompareResult = defaultJsonDifference
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
if (metaData.getRet() != null) {
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), JSON.toJSONString(metaData.getRet()));
}

else {
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), "{\"match\":true}");
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
} else {
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
}
}

@Test(dataProvider = "err", dataProviderClass = ObjectDataFactory.class)
public void noOptionErrTest(MetaData metaData) {
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
logger.info(metaData.getCaseName());
logger.debug(metaData.getExpect().toString()+"\n"+metaData.getActual().toString());
logger.debug(metaData.getExpect().toString() + "\n" + metaData.getActual().toString());
JsonCompareResult jsonCompareResult = defaultJsonDifference
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
Assert.assertEquals(JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
}

@Test(dataProvider = "optionRight", dataProviderClass = ObjectDataFactory.class)
public void optionRight(MetaData metaData) {
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
logger.info(metaData.getCaseName());
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n");
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n");
JsonCompareResult jsonCompareResult = defaultJsonDifference
.option(metaData.getOption())
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
if (metaData.getRet() != null) {
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), JSON.toJSONString(metaData.getRet()));
}
else {
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), "{\"match\":true}");
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
} else {
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
}
}

@Test(dataProvider = "optionErr", dataProviderClass = ObjectDataFactory.class)
public void optionErr(MetaData metaData) {
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
logger.info(metaData.getCaseName());
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n");
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n");
JsonCompareResult jsonCompareResult = defaultJsonDifference
.option(metaData.getOption())
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
Assert.assertEquals( JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package me.codeleep.jsondiff.test.utils;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
import me.codeleep.jsondiff.common.model.JsonCompareResult;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* @author: chenfeng
* @createTime: 2024/4/14 10:55
* @description: 格式化内容
*/
public class FormatContent {
private static final String REGEX = "[a-zA-Z]+(\\.[a-zA-Z0-9]+)+";
private static final Pattern pattern = Pattern.compile(REGEX);

/**
* 将返回的JsonCompareResult类转化为格式化的JSON字符串 并将其中的关于类型的部分去除 例如java.math.BigDecimal
* @param jsonCompareContent JsonCompareResult 执行对比后返回的内容
* @return String 格式化后的JSON字符串
*/
public static String formatComparisonContent(JsonCompareResult jsonCompareContent) {
return formatComparisonContent(JSON.toJSONString(jsonCompareContent));
}
/**
* 将String字符串转化为格式化的JSON字符串 并将其中的关于类型的部分去除 例如java.math.BigDecimal
* @param content String 需要格式化的字符串内容
* @return String 格式化后的JSON字符串
*/
public static String formatComparisonContent(String content) {
Matcher matcher = pattern.matcher(content);
JSONObject jsonObject = JSON.parseObject(matcher.replaceAll(""));
return JSON.toJSONString(jsonObject, JSONWriter.Feature.PrettyFormat);
}
}
Loading