簡體   English   中英

如何在Java中漂亮地打印無效/不完整的JSON

[英]How to pretty print invalid/incomplete JSON in Java

假設一個不完整的JSON字符串(例如,在中間被截斷),我怎樣才能最好地打印出我擁有的字符? 我為JSON遇到的所有漂亮打印都涉及到庫,但是它們假定一個有效且完整的JSON結構。

我對XML使用這里介紹的“強力”方法很好如何從Java漂亮地打印XML?

對JSON進行類似處理有什么想法嗎?

(我不想解析整個JSON結構,因為它可能很龐大,我只希望將其一小部分打印出來以用於日志記錄目的,而我希望它最小且快速-然后我希望將其漂亮地打印出來)。

這就是我最終解決此問題的方式。 這不是一個很好的解決方案,但是不確定是否可以做得更好(考慮到輸入限制問題)。 但是,它運行良好,並嘗試以最佳方式漂亮地打印json。 它基於此處為PHP提供的解決方案: https//gist.github.com/GloryFish/1045396

public String prettyPrintJSONAsString(String jsonString) {

    int tabCount = 0;
    StringBuffer prettyPrintJson = new StringBuffer();
    String lineSeparator = "\r\n";
    String tab = "  ";
    boolean ignoreNext = false;
    boolean inQuote = false;

    char character;

    /* Loop through each character to style the output */
    for (int i = 0; i < jsonString.length(); i++) {

        character = jsonString.charAt(i);

        if (inQuote) {

            if (ignoreNext) {
                ignoreNext = false;
            } else if (character == '"') {
                inQuote = !inQuote;
            }
            prettyPrintJson.append(character);
        } else {

            if (ignoreNext ? ignoreNext = !ignoreNext : ignoreNext);

            switch (character) {

            case '[':
                ++tabCount;
                prettyPrintJson.append(character);
                prettyPrintJson.append(lineSeparator);
                printIndent(tabCount, prettyPrintJson, tab);
                break;

            case ']':
                --tabCount;
                prettyPrintJson.append(lineSeparator);
                printIndent(tabCount, prettyPrintJson, tab);
                prettyPrintJson.append(character);
                break;

            case '{':
                ++tabCount;
                prettyPrintJson.append(character);
                prettyPrintJson.append(lineSeparator);
                printIndent(tabCount, prettyPrintJson, tab);
                break;

            case '}':
                --tabCount;
                prettyPrintJson.append(lineSeparator);
                printIndent(tabCount, prettyPrintJson, tab);
                prettyPrintJson.append(character);
                break;

            case '"':
                inQuote = !inQuote;
                prettyPrintJson.append(character);
                break;

            case ',':
                prettyPrintJson.append(character);
                prettyPrintJson.append(lineSeparator);
                printIndent(tabCount, prettyPrintJson, tab);
                break;

            case ':':
                prettyPrintJson.append(character + " ");
                break;

            case '\\':
                prettyPrintJson.append(character);
                ignoreNext = true;
                break;

            default:
                prettyPrintJson.append(character);
                break;
            }
        }
    }

    return prettyPrintJson.toString();
}

private void printIndent(int count, StringBuffer stringBuffer, String indent) {
    for (int i = 0; i < count; i++) {
        stringBuffer.append(indent);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM