【问题标题】:How to pretty print invalid/incomplete JSON in Java如何在 Java 中漂亮地打印无效/不完整的 JSON
【发布时间】:2013-12-16 15:42:00
【问题描述】:

假设一个不完整的 JSON 字符串(例如在中间被截断)我怎样才能最好地打印出我拥有的字符?我遇到的所有关于 JSON 的漂亮打印都涉及库,但它们假定一个有效且完整的 JSON 结构。

我可以使用此处为 XML 描述的“蛮力”方法:How to pretty print XML from Java?

对于 JSON 的类似处理有什么想法吗?

(我不想解析整个 JSON 结构,因为它可能很大,我只希望打印其中的一小部分用于日志记录目的,我希望它最小且快速——然后我希望它打印得漂亮)。

【问题讨论】:

  • 这将具有挑战性,因为无法从无效的 JSON 中推断出结构。这就是重点。
  • 所以没有办法像我为 XML 链接的问题/答案中那样使用正则表达式做类似的事情?
  • 如何在 JSON 的末尾添加一些]})" 以使其正确解析?

标签: java json pretty-print


【解决方案1】:

这就是我最终解决这个问题的方式。不是一个很好的解决方案,但不确定如何做得更好(考虑到有问题的输入限制)。但是它运行良好,并尝试尽可能地漂亮打印 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多