1. 程式人生 > >java如何將json資料格式化輸出到控制檯

java如何將json資料格式化輸出到控制檯

2018年08月24日更新:修復了部分情況json分行錯誤(json的value裡面存在“,”)

    /**
     * 輸出json
     *
     * @param response json格式響應實體
     */
    public static void output(JSONObject jsonObject) {
        if (jsonObject == null || jsonObject.isEmpty()) {
            output("json 物件是空的!");
            return;
        }
        String start = SourceCode.getManyString(SPACE_1, 3);
        String jsonStr = jsonObject.toString();// 先將json物件轉化為string物件
        jsonStr = jsonStr.replaceAll("\\\\/", OR);
        int level = 0;// 使用者標記層級
        StringBuffer jsonResultStr = new StringBuffer(">  ");// 新建stringbuffer物件,使用者接收轉化好的string字串
        for (int i = 0; i < jsonStr.length(); i++) {// 迴圈遍歷每一個字元
            char piece = jsonStr.charAt(i);// 獲取當前字元
            char last = jsonResultStr.charAt(jsonResultStr.length() - 1);
            // 如果上一個字元是斷行,則在本行開始按照level數值新增標記符,排除第一行
            if (i != 0 && '\n' == last) {
                for (int k = 0; k < level; k++) {
                    jsonResultStr.append(start);
                }
            }
            switch (piece) {
                case '{':
                case '[':
                    // 如果字元是{或者[,則斷行,level加1
                    jsonResultStr.append(piece + LINE);
                    level++;
                    break;
                case ',':
                    // 如果是“,”,則斷行
                    if ("\"0123456789l".contains(last + EMPTY)) jsonResultStr.append(piece + LINE);
                    break;
                case '}':
                case ']':
                    // 如果是}或者],則斷行,level減1
                    jsonResultStr.append(LINE);
                    level--;
                    for (int k = 0; k < level; k++) {
                        jsonResultStr.append(start);
                    }
                    jsonResultStr.append(piece);
                    break;
                default:
                    jsonResultStr.append(piece);
                    break;
            }
        }
        output("↘ ↘ ↘ ↘ ↘ ↘ ↘ ↘ json ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙");
        output(jsonResultStr.toString().replaceAll(LINE, LINE + ">  "));
        output("↗ ↗ ↗ ↗ ↗ ↗ ↗ ↗ json ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖");
    }

-----------------------------------分割線----------------------------------------

2018年08月16日更新,主要更新了輸出顯示效果:

/**
     * 輸出json
     *
     * @param response json格式響應實體
     */
    public static void output(JSONObject jsonObject) {
        if (jsonObject == null || jsonObject.isEmpty()) {
            output("json 物件是空的!");
            return;
        }
        String start = SourceCode.getManyString(SPACE_1, 3);
        String jsonStr = jsonObject.toString();// 先將json物件轉化為string物件
        jsonStr = jsonStr.replaceAll("\\\\/", OR);
        int level = 0;// 使用者標記層級
        StringBuffer jsonResultStr = new StringBuffer(">  ");// 新建stringbuffer物件,使用者接收轉化好的string字串
        for (int i = 0; i < jsonStr.length(); i++) {// 迴圈遍歷每一個字元
            char piece = jsonStr.charAt(i);// 獲取當前字元
            // 如果上一個字元是斷行,則在本行開始按照level數值新增標記符,排除第一行
            if (i != 0 && '\n' == jsonResultStr.charAt(jsonResultStr.length() - 1)) {
                for (int k = 0; k < level; k++) {
                    jsonResultStr.append(start);
                }
            }
            switch (piece) {
                case '{':
                case '[':
                    // 如果字元是{或者[,則斷行,level加1
                    jsonResultStr.append(piece + LINE);
                    level++;
                    break;
                case ',':
                    // 如果是“,”,則斷行
                    jsonResultStr.append(piece + LINE);
                    break;
                case '}':
                case ']':
                    // 如果是}或者],則斷行,level減1
                    jsonResultStr.append(LINE);
                    level--;
                    for (int k = 0; k < level; k++) {
                        jsonResultStr.append(start);
                    }
                    jsonResultStr.append(piece);
                    break;
                default:
                    jsonResultStr.append(piece);
                    break;
            }
        }
        output("↘ ↘ ↘ ↘ ↘ ↘ ↘ ↘ json ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙ ↙");
        output(jsonResultStr.toString().replaceAll(LINE, LINE + ">  "));
        output("↗ ↗ ↗ ↗ ↗ ↗ ↗ ↗ json ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖ ↖");
    }

---------------------------------------分割線-----------------------------------------------

本人在做介面測試的時候,需要把介面返回的json資料列印到控制檯,但是隻能通過tostring方法列印string,後來經過查閱資料,參考了一個別人的思路,自己寫了一個方法輸出json資料的,分享一下,供大家參考。

	// 輸出json
	public void output(JSONObject response) {
		String start = "丨  ";
		String jsonStr = response.toString();// 先將json物件轉化為string物件
		int level = 0;// 使用者標記層級
		StringBuffer jsonResultStr = new StringBuffer();// 新建stringbuffer物件,使用者接收轉化好的string字串
		for (int i = 0; i < jsonStr.length(); i++) {// 迴圈遍歷每一個字元
			char piece = jsonStr.charAt(i);// 獲取當前字元
			// 如果上一個字元是斷行,則在本行開始按照level數值新增標記符,排除第一行
			if (i != 0 && '\n' == jsonResultStr.charAt(jsonResultStr.length() - 1)) {
				for (int k = 0; k < level; k++) {
					jsonResultStr.append(start);
				}
			}
			switch (piece) {
			case '{':
			case '[':
				// 如果字元是{或者[,則斷行,level加1
				jsonResultStr.append(piece + "\n");
				level++;
				break;
			case ',':
				// 如果是“,”,則斷行
				jsonResultStr.append(piece + "\n");
				break;
			case '}':
			case ']':
				// 如果是}或者],則斷行,level減1
				jsonResultStr.append("\n");
				level--;
				for (int k = 0; k < level; k++) {
					jsonResultStr.append(start);
				}
				jsonResultStr.append(piece);
				break;
			default:
				jsonResultStr.append(piece);
				break;
			}
		}
		output(jsonResultStr.toString());
	}


下圖是結果顯示: