最近遇到個很煩人的問題。我如今作的業務有一部分是把以前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