質問

Assuming an incomplete JSON string (cut off in the middle for e.g.) how can I best pretty print the characters I have? All pretty printing I've come across for JSON involves libraries, but they assume a valid and complete JSON structure.

I'm fine with using a "brute-force" method as described here for XML: How to pretty print XML from Java?

Any ideas for similar handling for JSON?

(I don't want to parse the entire JSON structure since it can be massive, I only want a small part of it printed for logging purposes which I want to be minimal and fast-- and then I want it pretty printed).

役に立ちましたか?

解決

This is how I ended up solving this. Not a great solution, but not sure how it could've been done better (given the problematic input restrictions). It's working well however, and attempts to pretty-print json the best it can. It's building on the solution seen here for 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帰属
所属していません StackOverflow
scroll top