public class FormatJson { /** * prefix of ascii string of native character */ private static String PREFIX = "\\u"; public static String showJson(String json){ json = ascii2Native(json); json = formatJson(json, "<br>"); return json; } public static String native2Ascii(String str) { char[] chars = str.toCharArray(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < chars.length; i++) { sb.append(char2Ascii(chars[i])); } return sb.toString(); } /** * Native character to ascii string. * * @param c * native character * @return ascii string */ private static String char2Ascii(char c) { if (c > 255) { StringBuilder sb = new StringBuilder(); sb.append(PREFIX); int code = (c >> 8); String tmp = Integer.toHexString(code); if (tmp.length() == 1) { sb.append("0"); } sb.append(tmp); code = (c & 0xFF); tmp = Integer.toHexString(code); if (tmp.length() == 1) { sb.append("0"); } sb.append(tmp); return sb.toString(); } else { return Character.toString(c); } } /** * unicode編碼轉化爲漢字(asci編碼轉化爲16進制編碼) * * @param str * @return */ public static String ascii2Native(String unicodeStr) { StringBuilder sb = new StringBuilder(); int begin = 0; int index = unicodeStr.indexOf(PREFIX); while (index != -1) { sb.append(unicodeStr.substring(begin, index)); sb.append(ascii2Char(unicodeStr.substring(index, index + 6))); begin = index + 6; index = unicodeStr.indexOf(PREFIX, begin); } sb.append(unicodeStr.substring(begin)); return sb.toString(); } /** * 將asci編碼轉化爲16進制編碼 * * @param unicodeStr * @return */ private static char ascii2Char(String unicodeStr) { if (unicodeStr.length() != 6) { throw new IllegalArgumentException( "Ascii string of a native character must be 6 character."); } if (!"\\u".equals(unicodeStr.substring(0, 2))) { throw new IllegalArgumentException( "Ascii string of a native character must start with \"\\u\"."); } String tmp = unicodeStr.substring(2, 4); int code = Integer.parseInt(tmp, 16) << 8; tmp = unicodeStr.substring(4, 6); code += Integer.parseInt(tmp, 16); return (char) code; } /** * json字符串的格式化 * * @param jsonString * Json字符數據 * @param fillStringUnit * 每一層以前的佔位符號好比空格 製表符 * @return */ public static String formatJson(String jsonString, String fillStringUnit) { // 數據爲null,則返回空數據 if (jsonString == null || jsonString.trim().length() == 0) { return null; } // 預讀取(分行) ArrayList<String> eachRowStringList = new ArrayList<String>(); { String jsonTemp = jsonString; // 預讀取 while (jsonTemp.length() > 0) { // 獲取每一行的串 String eachRowString = getEachRowOfJsonString(jsonTemp); // 將此行字符串存入List當中 eachRowStringList.add(eachRowString.trim()); // 除去此行字符及其以前字符串後,剩餘的字符串(去執行下一次循環) jsonTemp = jsonTemp.substring(eachRowString.length()); } } int fixedLenth = 0; for (int i = 0; i < eachRowStringList.size(); i++) { String token = eachRowStringList.get(i); int length = token.getBytes().length; if (length > fixedLenth && i < eachRowStringList.size() - 1 && eachRowStringList.get(i + 1).equals(":")) { fixedLenth = length; } } StringBuilder buf = new StringBuilder(); int count = 0; for (int i = 0; i < eachRowStringList.size(); i++) { String token = eachRowStringList.get(i); if (token.equals(",")) { buf.append(token); doFill(buf, count, fillStringUnit); continue; } if (token.equals(":")) { buf.append(" ").append(token).append(" "); continue; } if (token.equals("{")) { String nextToken = eachRowStringList.get(i + 1); if (nextToken.equals("}")) { i++; buf.append("{ }"); } else { //count++; buf.append(token); doFill(buf, count, fillStringUnit); } continue; } if (token.equals("}")) { count--; doFill(buf, count, fillStringUnit); buf.append(token); continue; } if (token.equals("[")) { String nextToken = eachRowStringList.get(i + 1); if (nextToken.equals("]")) { i++; buf.append("[ ]"); } else { //count++; buf.append(token); //doFill(buf, count, fillStringUnit); } continue; } if (token.equals("]")) { //count--; //doFill(buf, count, fillStringUnit); buf.append(token); continue; } buf.append(token); // 左對齊 if (i < eachRowStringList.size() - 1 && eachRowStringList.get(i + 1).equals(":")) { int fillLength = fixedLenth - token.getBytes().length; if (fillLength > 0) { for (int j = 0; j < fillLength; j++) { buf.append(" "); } } } } return buf.toString(); } /** * 獲取每一行的串, { } [ ]等結尾的串 * * @param jsonString * @return */ private static String getEachRowOfJsonString(String jsonString) { StringBuilder buf = new StringBuilder(); boolean isInYinHao = false; while (jsonString.length() > 0) { // 獲取json串的第一個字符 String firstString = jsonString.substring(0, 1); // 若是第一個字符串是標點符號: { } [ ] , if (!isInYinHao && (firstString.equals(":") || firstString.equals("{") || firstString.equals("}") || firstString.equals("[") || firstString.equals("]") || firstString .equals(","))) { // 而且此行沒有數據,加入到此行當中 if (buf.toString().trim().length() == 0) { buf.append(firstString); } break; } // 除第一個字符以外的其餘字符 jsonString = jsonString.substring(1); // 若是是漢字字符 if (firstString.equals("\\")) { buf.append(firstString); buf.append(jsonString.substring(0, 1)); jsonString = jsonString.substring(1); continue; } // 若是是引號 if (firstString.equals("\"")) { buf.append(firstString); if (isInYinHao) { break; } else { isInYinHao = true; continue; } } buf.append(firstString); } return buf.toString(); } private static void doFill(StringBuilder buf, int count, String fillStringUnit) { buf.append("\n"); for (int i = 0; i < count; i++) { buf.append(fillStringUnit); } } }
上次是js版本的,此次來一發後臺版本的,詳情見上幾篇js格式json數據 java
入口 json
showJson(json); app
formateJson(json,fillStringUnit); 其實也能夠 ui