最近和一個第三方的系統對接,須要把他們的請求參數保存下來,可是那一長串的json很差讀,因而想格式化一下,這種工具備不少,但我想本身弄個來玩下。
剛開始的實現用了不少判斷,邏輯很繞。後來想起以前讀過一個模板引擎的源碼,裏面用了狀態圖,因而我也嘗試用了下。java
public class Main { private static String NEW_LINE = "\r\n"; public static void main(String[] args) { String json = "[{\"name\": \"wen\",\"age\": 12,\"flag\": true,\"job\": [{\"name\":\"java\"},{\"name\": \"c++\"}]},{\"name\": \"yun\",\"age\": 13,\"flag\": false}]"; System.out.println(format(json)); } private static String format(String json) { // 去除原來的格式 json = json.replace("\n", "").replace("\r", "").replace("\t", ""); StringBuilder sb = new StringBuilder(); int prevStatus = 0;// 上一狀態 int level = 0;// 縮進層級 for (char c : json.toCharArray()) { int oper = getOperation(prevStatus, c); switch (oper) { case 1: sb.append(NEW_LINE).append(getTab(level)); break; case 2: level++; sb.append(NEW_LINE).append(getTab(level)); break; case 3: level--; sb.append(NEW_LINE).append(getTab(level)); break; case 4: sb.append(' '); break; } sb.append(c); prevStatus = getStatus(c); } return sb.toString(); } // 返回:0直接輸出,1換行,2增長縮進並換行,3減小縮進並換行,4前面加空格 private static int[][] statusArr = new int[][] { {0, 0, 0, 0, 0, 3}, // 普通字符 {1, 2, 2, 0, 0, 0}, // {[ {2, 0, 4, 0, 0, 0}, // : {3, 1, 4, 0, 0, 0}, // , {4, 0, 0, 0, 0, 3},};// }] // 根據前一狀態和當前字符決定操做 private static int getOperation(int status, char c) { return statusArr[status][getStatus(c) + 1]; } // 字符轉換成對應狀態 private static int getStatus(char c) { int status = 0; switch (c) { case '{': case '[': status = 1; break; case ':': status = 2; break; case ',': status = 3; break; case '}': case ']': status = 4; break; } return status; } // 縮進 private static String getTab(int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append(" "); } return sb.toString(); } }
執行結果c++
[ { "name": "wen", "age": 12, "flag": true, "job": [ { "name":"java" }, { "name": "c++" } ] }, { "name": "yun", "age": 13, "flag": false } ]