最近遇到个很烦人的问题。我如今作的业务有一部分是把以前app服务端的.net接口转译java接口。可是有些以前的接口,一个接口干上十几件事情,返回的json串长达五六几百行。着实看的就让人头大。可是若是返回的json串和原来的对不上,那app客户端就没法正常显示,人工去对比那是耗时耗力。因此我就想找一个程序,能把json串格式化好,而后按字段名称排好序,在逐行进行对比,就能很快就能找出不一样比人工要快无数倍。找了半天也无法发现合适的。因而只好本身写一个。这个工具主要的思路是,将json串格式化并根据key值排好序,理论上相同的字段都排在相同的位置,而后根据这个去逐行进行比较,若是不相同就标为红色。若是相同就不变,试用了下,效果还不错,因此拿出来分享,但愿你们都不用加班。哈哈java
其中遇到一个坑fastjson 中带的字段排序总不能很好的解决个人问题,排序总有问题。因此我就本身写了一段方法进行排序。git
private Map<String, Object> sortField(Map<String, Object> map){ //new 一个排序的Map 在构造方法中传入比较器 Map<String, Object> treeMap = new TreeMap<>(new MapComparator()); for (Map.Entry<String, Object> entry : map.entrySet()){ Object value = entry.getValue(); //去掉空和空字符串 if (value == null || (value instanceof String && StringUtils.isBlank((String) value))){ continue; } //判断是否是 JSONObject 若是是转化成TreeMap if (value instanceof JSONObject){ //JSONObject 覆写了toString 全部能够直接调用toString treeMap.put(entry.getKey(), sortField(JSON.parseObject(value.toString(), Map.class))); //判断是否是 JSONArray }else if (value instanceof JSONArray){ //若是是 强转成 JSONArray 而且遍历它 JSONArray jsonArray = (JSONArray) value; List<Object> list = new ArrayList<>(jsonArray.size()); for (Object object : jsonArray){ //判断里面的是不是 JSONObject 若是是转化成TreeMap if (object instanceof JSONObject){ object = sortField(JSON.parseObject(object.toString(), Map.class)); } //其余基础类型直接放进去 list.add(object); } //list 排序方便比较 list.sort(new ListComparator()); treeMap.put(entry.getKey(), list); }else { //其余基础类型直接放进去 treeMap.put(entry.getKey(), value); } } return treeMap; }
class MapComparator implements Comparator<String> { @Override public int compare(String str1, String str2) { return str1.compareTo(str2); } }
class ListComparator implements Comparator<Object> { @Override public int compare(Object o1, Object o2) { //由于这里面不是基础类型就是Map 或者他们的 map的toString方法被复写过 会把全部的key和value组合拼接成字符串 //好比 map.put("key":"value"); toString 会变成 {"key":"value"} String str1 = o1.toString(); String str2 = o2.toString(); //得到其字符串长度 Integer length1= str1.length(); Integer length2 = str2.length(); //先比较其长度 int i = length1.compareTo(length2); //若是长度相同 在比较实际字符串 if (i == 0){ return str1.compareTo(str2); } return i; } }
该方法接受一个由json串转化成的map。github
Map<String, Object> treeMap = sortField(JSON.parseObject(json, Map.class));
这样调用便可。json
下面是这个小工具的github地址,若是有须要的能够下来用用。主要是对json串排序,而后逐行比较app
https://github.com/RaidenXin/json-comparatoride
也能够直接下载,在装有java环境的机器上可执行的jar包 升级版 0.0.3工具
https://files.cnblogs.com/files/Raiden-xin/json_comparator_jar.zipspa
若有转载请说明来处,谢谢.net