Java格式化json字符串

Java的Json對象轉字符串如果不格式化非常難看,這裏寫了一個格式化方法。

Json字符串:

{a:123,b:456,c:{d:789,e:101},f:102,g:{}}

Json字符串格式化之後:

{
    a:123,
    b:456,
    c:
    {
        d:789,
        e:101
    }
    ,
    f:102,
    g:
    {
    }
}

public class Test {

    public static void main(String[] args) {
        String json = "{a:123,b:456,c:{d:789,e:101},f:102,g:{}}";
        System.out.println(formateJson(json));
    }

    /**
    * 不支持值裏面帶有這5個符號:,{}[]
    */
    private static String formateJson(String json) {
        if (json.charAt(0) != '{' || json.charAt(json.length() - 1) != '}') {
            throw new RuntimeException("兄弟別搞事啊,json字符串可是以\"{\"開頭且以\"}\"結尾,你傳進來的可不是這樣!");
        }
        int pidx = 0;// {}[]上一個位置
        int idx = 0;// {}[]當前位置
        String padding = "    ";
        String linePadding = "";
        StringBuilder sb = new StringBuilder();
        while (true) {
            idx = getIdx(json, pidx);
            if (idx < 0) {// 從上一個位置後沒有找到{}[]
                sb.append(json.substring(pidx, json.length()));
                break;
            }
            String nextLinePadding = linePadding;
            if (isOpen(json, pidx) && isOpen(json, idx)) {
                linePadding += padding;
                nextLinePadding = linePadding;
            } else if (isOpen(json, pidx) && isEnd(json, idx)) {
                nextLinePadding = linePadding;
                linePadding += padding;
            } else if (isEnd(json, pidx) && isOpen(json, idx)) {
                if (linePadding.length() >= padding.length()) {
                    linePadding = linePadding.substring(0, linePadding.length() - padding.length());
                }
                nextLinePadding = linePadding;
            } else if (isEnd(json, pidx) && isEnd(json, idx)) {
                if (linePadding.length() >= padding.length()) {
                    linePadding = linePadding.substring(0, linePadding.length() - padding.length());
                }
                if (linePadding.length() >= padding.length()) {
                    nextLinePadding = linePadding.substring(0, linePadding.length() - padding.length());
                }
            }
            if (pidx + 1 < idx) {
                String content = json.substring(pidx + 1, idx);
                if (!",".equals(content)) {
                    content = content.replaceAll(",", ",\r\n" + linePadding);
                }
                sb.append(json.substring(pidx, pidx + 1) + "\r\n" + linePadding + content + "\r\n" + nextLinePadding);
            } else {
                sb.append(json.substring(pidx, pidx + 1) + "\r\n" + nextLinePadding);
            }
            pidx = idx;
        }
        return sb.toString();
    }

    public static int getIdx(String json, int fromIndex) {
        char[] chars = new char[]{'{', '}', '[', ']'};
        int idx = -1;
        for (int i = 0; i < chars.length; i++) {
            int t = json.indexOf(chars[i], fromIndex + 1);
            if (t > -1) {
                if (idx == -1 || t < idx) {
                    idx = t;
                }
            }
        }
        return idx;
    }

    public static boolean isOpen(String json, int idx) {
        if (idx > -1 && idx < json.length()) {
            if (json.charAt(idx) == '{' || json.charAt(idx) == '['){
                return true;
            }
        }
        return false;
    }

    public static boolean isEnd(String json, int idx) {
        if (idx > -1 && idx < json.length()) {
            if (json.charAt(idx) == '}' || json.charAt(idx) == ']') {
                return true;
            }
        }
        return false;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章