Json串排序(隨文附帶一個json串排序和對比的小工具)


最近遇到個很煩人的問題。我現在做的業務有一部分是把之前app服務端的.net接口轉譯java接口。但是有些之前的接口,一個接口干上十幾件事情,返回的json串長達五六幾百行。着實看的就讓人頭大。但是如果返回的json串和原來的對不上,那app客戶端就無法正常顯示,人工去對比那是耗時耗力。所以我就想找一個程序,能把json串格式化好,然后按字段名稱排好序,在逐行進行對比,就能很快就能找出不同比人工要快無數倍。找了半天也沒法發現合適的。於是只好自己寫一個。這個工具主要的思路是,將json串格式化並根據key值排好序,理論上相同的字段都排在相同的位置,然后根據這個去逐行進行比較,如果不相同就標為紅色。如果相同就不變,試用了下,效果還不錯,所以拿出來分享,希望大家都不用加班。哈哈

其中遇到一個坑fastjson 中帶的字段排序總不能很好的解決我的問題,排序總有問題。所以我就自己寫了一段方法進行排序。

 

    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。

Map<String, Object> treeMap = sortField(JSON.parseObject(json, Map.class));

這樣調用即可。

下面是這個小工具的github地址,如果有需要的可以下來用用。主要是對json串排序,然后逐行比較

https://github.com/RaidenXin/json-comparator

也可以直接下載,在裝有java環境的機器上可執行的jar包 升級版 0.0.3

https://files.cnblogs.com/files/Raiden-xin/json_comparator_jar.zip

如有轉載請說明來處,謝謝

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM