用Java对JSON字符串进行格式化输出

工作中进行http相关接口测试时经常会收到返回的json数据,因为没有格式化输入到控制台后看起来很不直观。

早上写了一个小工具类,对这JSON串进行格式化输出,代替System.out.print

/**
 * 格式化输入工具类
 * 
 * @author lizhgb
 * @date 2015-10-14
 * @Modified 2017-04-28
 * 
 */
public final class FormatUtil {

    /**
     * 打印输入到控制台
     * 
     * @param jsonStr
     * @author lizhgb
     * @Date 2015-10-14 下午1:17:22
     */
    public static void printJson(String jsonStr) {
        System.out.println(formatJson(jsonStr));
    }

    /**
     * 格式化
     * 
     * @param jsonStr
     * @return
     * @author lizhgb
     * @Date 2015-10-14 下午1:17:35
     * @Modified 2017-04-28 下午8:55:35
     */
    public static String formatJson(String jsonStr) {
        if (null == jsonStr || "".equals(jsonStr))
            return "";
        StringBuilder sb = new StringBuilder();
        char last = '\0';
        char current = '\0';
        int indent = 0;
        boolean isInQuotationMarks = false;
        for (int i = 0; i < jsonStr.length(); i++) {
            last = current;
            current = jsonStr.charAt(i);
            switch (current) {
            case '"':
                                if (last != '\\'){
                    isInQuotationMarks = !isInQuotationMarks;
                                }
                sb.append(current);
                break;
            case '{':
            case '[':
                sb.append(current);
                if (!isInQuotationMarks) {
                    sb.append('\n');
                    indent++;
                    addIndentBlank(sb, indent);
                }
                break;
            case '}':
            case ']':
                if (!isInQuotationMarks) {
                    sb.append('\n');
                    indent--;
                    addIndentBlank(sb, indent);
                }
                sb.append(current);
                break;
            case ',':
                sb.append(current);
                if (last != '\\' && !isInQuotationMarks) {
                    sb.append('\n');
                    addIndentBlank(sb, indent);
                }
                break;
            default:
                sb.append(current);
            }
        }

        return sb.toString();
    }

    /**
     * 添加space
     * 
     * @param sb
     * @param indent
     * @author lizhgb
     * @Date 2015-10-14 上午10:38:04
     */
    private static void addIndentBlank(StringBuilder sb, int indent) {
        for (int i = 0; i < indent; i++) {
            sb.append('\t');
        }
    }
}

测试:

@Test
    public void jsonPrintTest2() {

        String str = "{\"content\":\"this is the msg content.\",\"tousers\":\"user1|user2\",\"msgtype\":\"texturl\",\"appkey\":\"test\",\"domain\":\"test\","
                + "\"system\":{\"wechat\":{\"safe\":\"1\"}},\"texturl\":{\"urltype\":\"0\",\"user1\":{\"spStatus\":\"user01\",\"workid\":\"work01\"},\"user2\":{\"spStatus\":\"user02\",\"workid\":\"work02\"}}}";
        FormatUtil.printJson(str);
    }

输出:

{
    "content":"this is the msg content.",
    "tousers":"user1|user2",
    "msgtype":"texturl",
    "appkey":"test",
    "domain":"test",
    "system":{
        "wechat":{
            "safe":"1"
        }
    },
    "texturl":{
        "urltype":"0",
        "user1":{
            "spStatus":"user01",
            "workid":"work01"
        },
        "user2":{
            "spStatus":"user02",
            "workid":"work02"
        }
    }
}

转自:

https://my.oschina.net/jasonli0102/blog/517052?p={{page}}#comment-list

猜你喜欢

转载自blog.csdn.net/lyt_7cs1dn9/article/details/71070965