import com.alibaba.fastjson.JSONObject;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class TestJson {
public static void main(String[] args) {
//height覆盖比较low;
String height="{"picture":{"key":"need1","value":"yes"},"noter":"3psserson","title":"阶段s配置"}";
String low="{"picture":{"key":"need","value":"yes","edg":"np"},"noter":"3person","title":"阶段配置"}";
Map confMap = new HashMap<>();
compare(height,low,confMap);
System.out.println(confMap.get("conf"));
}
//判断字符串是否是json格式
public static boolean isJson(String content) {
try {
JSONObject.parseObject(content);
return true;
} catch (Exception e) {
return false;
}
}
//height为主配置覆盖low配置
static void compare(Object heights,Object lows,Map confMap){
JSonObject jsCopy = JSONObject.parseObject(heights.toString()); //将主配置copy一份
if(null==lows){
confMap.put("conf",jsCopy.toString());
}
JSonObject heightJS = JSONObject.parseObject(heights.toString());
JSonObject lowJS = JSONObject.parseObject(lows.toString());
//遍历低配置
Iterator i = lowJS.entrySet().iterator();
while (i.hasNext()) {
Map.Entry entry = (Map.Entry) i.next();
//如果包含该key值就进行比较,必须保证两边的value值的属性一直
if(heightJS.containsKey(entry.getKey().toString())){
if(null==heightJS.get(entry.getKey().toString())){//如果没值就直接返回
continue;
}
//如果值是map或者list就需要递归比较
if(isJson(entry.getValue().toString())){
compare(heightJS.get(entry.getKey().toString()),entry.getValue(),confMap);
jsCopy.put(entry.getKey().toString(),JSONObject.parseObject(confMap.get("conf").toString()));
}
//不管相等还是不相等最终保存的都是heightJS里面的内容,所以什么都不做就好
//else{}
}else {
//将不包含的key放入
jsCopy.put(entry.getKey().toString(),entry.getValue());
}
}
//最后一次得到的json串就是比较完之后的json
confMap.put("conf",jsCopy.toString());
}
}
jsonObject要求不能包含list,map里面可以包含map无限比较;
备注:为什么用map存储配置信息不用String直接存储,因为在方法中赋值的时候相当于新建了String,指向新地址,而main方法里面的String依旧指向的是旧地址,所以赋值是不会成功的



