java格式化json

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

相關文章
相關標籤/搜索