记录json对比工具类
/**
* @program: bedrock
* @description: 复杂对象比较工具类
* @author:
* @create: 2022-01-26 22:49
**/
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @description: 对象对比工具类
* @author: guo-coffee
*/
public class ComparedUtils {
/**
* 示例说明(更多事例可查看main方法):
* 对比json:{"id":"tom","username":"tom","age":18,"address":[{"province":"上海市"},{"city":"上海市"},{"disrtict":"静安区"},{"id":"静安区"}]}
*
* 示例一:调用compareJson(JSONObject json1, JSONObject json2, List<String> compareList)
* 假设指定username、address_province两列对比,compareList中需要放入username、address、address_province。
* 解释:若compareList集合中不放address,则表示整个address均不会进入比较,所以json嵌套多层时,将父key也需要放入compareList中
*
* 事例二:调用compareJson(JSONObject json1, JSONObject json2, List<String> filterList,boolean flag)
* 1、假设指定username、address_province两列不进行对比,filterList中需要放入username、address_province即可
* 2、假设整个address均不进行比对,filterList中需要放入username、address即可
*/
/**
* 默认过滤列名(由于项目会继承一些基类[例如ID、操作人、操作时间、修改人、修改时间等],基类中属性对比无任何意义,可以过滤掉)
*/
private static final List<String> DEFAULT_FILTER_COLUMNS = Arrays.asList("id","createDate","updateDate","createPersonId","createPersonName","updatePersonId","updatePersonName","concurrencyVersion","delflag","tendId");
/**
* json嵌套多层时,父子key拼接字符
*/
private static final String SEPARATOR = "->";
/**
* 两个对象对比(全部列对比)
* @param json1 对比对象,必传
* @param json2 对比对象,必传
* @return
*/
public static Map<String,List<String>> compareJson(JSONObject json1, JSONObject json2){
return compareJson(json1,json2,false);
}
/**
* 两个对象对比
* @param json1 对比对象,必传
* @param json2 对比对象,必传
* @param flag 是否采用默认过滤策略-->true:采用 false:不采用
* @return
*/
public static Map<String,List<String>> compareJson(JSONObject json1, JSONObject json2, boolean flag){
return compareJson(json1,json2,null,null,flag,null,null,new ArrayList<>(),new ArrayList<>());
}
/**
* 两个对象对比
* @param json1 对比对象,必传
* @param json2 对比对象,必传
* @param compareList 要比较的列
* @return
*/
public static Map<String,List<String>> compareJson(JSONObject json1, JSONObject json2, List<String> compareList){
return compareJson(json1,json2,compareList,null,false,null,null,new ArrayList<>(),new ArrayList<>());
}
/**
* 两个对象对比
* @param json1 对比对象,必传
* @param json2 对比对象,必传
* @param filterList 不需要比较的列
* @param flag 是否需要过滤默认列-->true:需要 false:不需要
* @return
*/