需求
实现一个方法,可以根据预期的期望值(类型json)去断言实际值(json),期望值需要高可配。其中jsonarray的处理花了点时间。
例子
String except_value1="{"a":1}";
String actual_value1="{"a":1,"b":2}";
匹配!
String except_value2="{"list":[{"a":1}]}";
String actual_value2="{"list":[{"a":1},{"b":2}]}";
匹配!
String actual_value3="{"list":[{"a":1,"lista":[{"a":2},{"b":3}]},{"b":2}]}";
String actual_value14="{"list":[{"a":1,"lista":[{"a":2},{"b":3,"c":4}]},{"b":2}]}";
匹配!
反过来就不匹配了~
思路
循环期望值:
如果是jsonNull:
Assert;
如果是JsonObject:
递归;
如果是JsonArray:
迭代期望值中的元素:
迭代实际值中的元素:
递归;
如果实际值列表又一个元素符合期望值当前元素:
break;
如果没有一个符合:
该期望值元素校验不通过;
如果是JsonPrimitive:
如果是数组中的JsonPrimitive:
标记断言结果
否则:直接Assert;
主要用了递归的思路
代码:
import com.google.gson.*;
import net.sf.json.JSONArray;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.Assert;
import java.util.Iterator;
import java.util.Map;
/**
* @author wj
* @date 2020-11-23
*/
public class DAssertUtil {
private static final Loggerlogger = LoggerFactory.getLogger(DAssertUtil.class);
public DAssertUtil() {
}
public static void DAssert(String ex,String ac){
Assert.assertTrue(ex+"与"+ac+"校验失败",assertJson(ex,ac));
}
/**
*/
public static boolean assertJson(String ex,String ac){
boolean result=true;
JsonElement exJE =new JsonParser().parse(ex);
JsonElement acJE =new JsonParser().parse(ac);
if (exJE.isJsonObject()&&acJE.isJsonObject()) {
JsonObject exJO = exJE.getAsJsonObject();
JsonObject acJO = acJE.getAsJsonObject();
result=assertJson(exJO,acJO,result,false);
//传入的还是一个json数组
}else if (exJE.isJsonArray()&&acJE.isJsonArray()){
//todo
JsonArray jsonArray = exJE.getAsJsonArray();
Iterator iterator = jsonArray.iterator();
while (iterator.hasNext()) {
JsonElement jsonElement1 = iterator.next();
try {
jsonElement1.getAsJsonObject();
}catch (IllegalStateException ie) {
assertJson(jsonElement1.getAsString(), acJE.getAsString());
continue;
}
JsonArray acJsonArray = acJE.getAsJsonArray();
Iterator acIterator = acJsonArray.iterator();
boolean res1=false;
while (acIterator.hasNext()){
res1=res1||assertJson(jsonElement1.getAsJsonObject(),acIterator.next().getAsJsonObject(),result,true);
}
result=res1;
}
//assertContainArray(JSONArray.fromObject(ex),JSONArray.fromObject(ac));
}else if (exJE.isJsonPrimitive()&&acJE.isJsonPrimitive()){
System.out.println("please check the json format!");
}else if (exJE.isJsonNull()){
Assert.assertTrue(acJE.isJsonNull());
}
else {
Assert.assertFalse("两者格式不对应",false);
}
return result;
}
/**
* 判断
* */
public static boolean assertJson(JsonObject exJO,JsonObject acJO,boolean result,boolean isArray){
for (Map.Entry object : exJO.entrySet()){
String key = object.getKey();
JsonElement value = object.getValue();
result=result&&acJO.has(key);
if (value.isJsonNull()){
//todo
result=result&&acJO.get(key).isJsonNull();
continue;
}
else if (value.isJsonObject()){
//todo
//递归JsonObject
result=result&&assertJson(value.getAsJsonObject(),acJO.get(key).getAsJsonObject(),result,false);
//如果是JsonArray数组则迭代,然后进行递归
}else if (value.isJsonArray()){
//todo
JsonArray jsonArray = value.getAsJsonArray();
Iterator iterator = jsonArray.iterator();
while (iterator.hasNext()) {
JsonElement jsonElement1 = iterator.next();
try {
jsonElement1.getAsJsonObject();
}catch (IllegalStateException ie) {
result=assertJson(jsonElement1.getAsString(), acJO.get(key).toString());
continue;
}
//如果实际值不是array,就转成array
JsonArray acJsonArray =new JsonArray();
boolean res2=false;
if (!acJO.has(key)){
res2=res2||acJO.has(key);
result=result&&res2;
continue;
}
if(!acJO.get(key).isJsonArray()){
jsonArray.add(acJO.get(key));
}
else {
acJsonArray = acJO.get(key).getAsJsonArray();
}
Iterator acIterator = acJsonArray.iterator();
while (acIterator.hasNext()){
JsonElement jsonElement2 = acIterator.next();
res2=res2||assertJson(jsonElement1.getAsJsonObject(),jsonElement2.getAsJsonObject(),true,true);
if(res2){
break;
}
}
if(!res2){
Assert.assertTrue("key["+key+"]下元素值为:"+jsonElement1.toString()+"校验不通过",false);
}
result=result&&res2;
}
}
else if (value.isJsonPrimitive()){
//todo
try {
JsonElement element =new JsonParser().parse(value.getAsString());
if (element.isJsonNull()){
Assert.assertTrue("["+key+"] ex:"+element+" ac:"+acJO.get(key).getAsString(),new JsonParser().parse(acJO.get(key).getAsString()).isJsonNull());
}else if (element.isJsonObject()) {
assertJson(value.getAsJsonObject(),acJO.get(key).getAsJsonObject(),result,false);
}else if (element.isJsonPrimitive()) {
//JsonPrimitive jsonPrimitive = element.getAsJsonPrimitive();
if(!isArray){
Assert.assertEquals(value,acJO.get(key));
}
else {
result=result&&(value.equals(acJO.get(key)));
if(!result){
return result;
}
}
}else if (element.isJsonArray()) {
JsonArray jsonArray = element.getAsJsonArray();
Iterator iterator = jsonArray.iterator();
while (iterator.hasNext()) {
return assertJson(iterator.next().getAsJsonObject(),acJO.get(key).getAsJsonObject(),result,true);
}
}
}catch (Exception e){
if(!isArray){
Assert.assertEquals(value,acJO.get(key));
}
else {
result=result&&(value.equals(acJO.get(key)));
if(!result){
return result;
}
}
logger.error(e.toString());
}
}
}
return result;
}
public static void main(String[] args) {
String a="{\"a\":\"\"}";
String b="{\"a\":1,\"b\":2}";
String lista="{\"list\":[{\"a\":\"\"}]}";
String listb="{\"list\":[{\"a\":1},{\"b\":2}]}";
String q="{\"list\":[{\"a\":1,\"lista\":[{\"a\":2},{\"b\":3}]},{\"b\":2}]}";
String p="{\"list\":[{\"a\":1,\"lista\":[{\"a\":2},{\"b\":3,\"c\":4}]},{\"b\":2}]}";
DAssert(a,b);
DAssert(b,a);
DAssert(q,p);
DAssert(p,q);
DAssert(lista,listb);
DAssert(listb,lista);
DAssert(a,b);
}
}
网友评论