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<String , Object> 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依旧指向的是旧地址,所以赋值是不会成功的