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());
	}


下图是结果显示:

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页