我们经常会重构一些复杂的接口,那么对于返回字段多并且逻辑复杂的接口如何来验证? 有如下几种方案
image.png
image.png json递归对比代码
/**
* json比较
*/
public static StringBuffer compareJsonObject(JSONObject aJsonObject, JSONObject bJsonObject, String keyy, List<String> list) {
StringBuffer sb = new StringBuffer();
Iterator<String> aKeys = aJsonObject.keySet().iterator();// jsonObject.keys();
if (null == bJsonObject) {
sb.append("b中缺失字段,key=").append(keyy).append("的value为null。a中的value=").append(JSONObject.toJSONString(aJsonObject.keySet())).append(";");
return sb;
}
while (aKeys.hasNext()) {
String key = aKeys.next();
if (!(aJsonObject.get(key) instanceof JSONObject) &&
!(aJsonObject.get(key) instanceof JSONArray) &&
null != aJsonObject.get(key)) {
Object aFiled = aJsonObject.get(key);
if (null == bJsonObject.get(key)) {
if (list.contains(key)) {
continue;
}
sb.append("字段不同,字段 = ").append(key).append(",aValue = ").append(aFiled).append(";");
continue;
}
Object bFiled = bJsonObject.get(key);
if (aFiled instanceof Number) {
Number aFiledNumber = (Number) aFiled;
if (bFiled instanceof Number) {
Number bFiledNumber = (Number) bFiled;
if (aFiledNumber.doubleValue() * num == bFiledNumber.doubleValue() * num) {
continue;
}
}
}
if (!aFiled.toString().equals(bFiled.toString())) {
if (list.contains(key)) {
continue;
}
sb.append("a和b对比不同,字段 = ").append(key).append(",aValue = ").append(aFiled).append(",bValue = ").append(bFiled).append(";");
continue;
}
}
if (aJsonObject.get(key) instanceof JSONObject) {
if (null == bJsonObject.get(key)) {
if (list.contains(key)) {
continue;
}
sb.append("b中缺失此对象,对象=").append(key).append(",aValue = ").append(JSONObject.toJSONString(aJsonObject.get(key))).append(";");
continue;
}
if (!(bJsonObject.get(key) instanceof JSONObject)) {
if (list.contains(key)) {
continue;
}
sb.append("b中的字段").append(key).append("不是JSONObject类型").append(",aValue = ").append(JSONObject.toJSONString(aJsonObject.get(key))).append(";");
continue;
}
JSONObject aInnerObject = (JSONObject) aJsonObject.get(key);
JSONObject bInnerObject = (JSONObject) bJsonObject.get(key);
sb.append(compareJsonObject(aInnerObject, bInnerObject, key, list));
} else if (aJsonObject.get(key) instanceof JSONArray) {
if (null == bJsonObject.get(key)) {
if (list.contains(key)) {
continue;
}
sb.append("b中缺失此集合,集合=").append(key).append(",aValue = ").append(aJsonObject.get(key)).append(";");
continue;
}
if (!(bJsonObject.get(key) instanceof JSONArray)) {
if (list.contains(key)) {
continue;
}
sb.append("b中的字段").append(key).append("不是JSONArray类型").append(",aValue = ").append(JSONObject.toJSONString(aJsonObject.get(key))).append(";");
continue;
}
JSONArray aInnerArray = (JSONArray) aJsonObject.get(key);
JSONArray bInnerArray = (JSONArray) bJsonObject.get(key);
sb.append(compareJsonArray(aInnerArray, bInnerArray, key, list));
}
}
return sb;
}
private static StringBuffer compareJsonArray(JSONArray aJsonArray, JSONArray bJsonArray, String key, List<String> list) {
//进行排序
if (key.equals("price_item")){
aJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("bill_type_name")));
bJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("bill_type_name")));
}else if (key.equals("item")){
aJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("name")));
bJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("name")));
}else if (key.equals("spec_req_price_item")){
aJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("name")));
bJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("name")));
}else if (key.equals("porterage_address_item")){
aJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("k")));
bJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("k")));
}else if (key.equals("virtual_phone_info")){
try {
aJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("user_phone_no")));
bJsonArray.sort(Comparator.comparing(item -> ((JSONObject) item).getString("user_phone_no")));
}catch (Exception e){
log.error("对比服务排序异常",e);
}
}
StringBuffer sb = new StringBuffer();
if (aJsonArray != null) {
Iterator aIterator = aJsonArray.iterator();
if (null == bJsonArray) {
sb.append("b中的JSONArray为null,key = ").append(key).append(",aValue = ").append(JSONObject.toJSONString(aJsonArray)).append(";");
return sb;
}
Iterator bIterator = bJsonArray.iterator();
while (aIterator.hasNext()) {
Object aKey = aIterator.next();
if (!bIterator.hasNext()) {
if (list.contains(key)) {
continue;
}
sb.append("JSONArray b中缺失此集合,集合=").append(key).append(",aValue = ").append(JSONObject.toJSONString(aKey)).append(";");
continue;
}
Object bKey = bIterator.next();
if (aKey instanceof JSONObject) {
if (null == bKey) {
if (list.contains(key)) {
continue;
}
sb.append("JSONArray b中缺失此对象,对象=").append(key).append(";");
continue;
}
if (!(bKey instanceof JSONObject)) {
sb.append("JSONArray b中的 字段").append(bKey).append("不是JSONObject类型;");
continue;
}
JSONObject aInnerObject = (JSONObject) aKey;
JSONObject bInnerObject = (JSONObject) bKey;
sb.append(compareJsonObject(aInnerObject, bInnerObject, key, list));
} else if (aKey instanceof JSONArray) {
JSONArray aInnerObject = (JSONArray) aKey;
if (null == aInnerObject) {
continue;
}
if (null == bKey) {
if (list.contains(key)) {
continue;
}
sb.append("JSONArray b中缺失此集合,集合=").append(key).append(";");
continue;
}
if (!(bKey instanceof JSONArray)) {
sb.append("JSONArray b中的 字段").append(bKey).append("不是JSONArray类型;");
continue;
}
JSONArray bInnerObject = (JSONArray) bKey;
sb.append(compareJsonArray(aInnerObject, bInnerObject, key, list));
}
}
}
return sb;
}