11

如何显示格式类似于的 JSON 响应字符串https://jsonformatter.org/json-parser

例如:如何在 textview 中显示以下代码?

{
    "age":100,
    "name":"mkyong.com",
    "messages":["msg 1","msg 2","msg 3"]
}

PS:最好是彩色格式。

简而言之 ..

1.如何格式化和显示JSON字符串?
2.如何格式化和显示Java代码?

4

8 回答 8

28

我编写了以下实用方法来格式化和缩进(还没有颜色):

public static String formatString(String text){

    StringBuilder json = new StringBuilder();
    String indentString = "";

    for (int i = 0; i < text.length(); i++) {
        char letter = text.charAt(i);
        switch (letter) {
            case '{':
            case '[':
                json.append("\n" + indentString + letter + "\n");
                indentString = indentString + "\t";
                json.append(indentString);
                break;
            case '}':
            case ']':
                indentString = indentString.replaceFirst("\t", "");
                json.append("\n" + indentString + letter);
                break;
            case ',':
                json.append(letter + "\n" + indentString);
                break;

            default:
                json.append(letter);
                break;
        }
    }

    return json.toString();
}
于 2013-01-09T11:55:19.537 回答
10

更简单的方法,有toString一种带有缩进空间参数的方法JSONObject

可以这样使用:

JSONObject jsonObject = new JSONObject(jsonString);
textView.setText(jsonObject.toString(4));// 4 is number of spaces for indent

同样适用于JSONArray

参考 :

https://developer.android.com/reference/org/json/JSONObject#toString(int)

https://alvinalexander.com/android/android-json-print-json-string-human-readable-format-debugging

于 2018-08-09T18:17:44.300 回答
3

@suhas_sm 建议的方法很棒,但如果键或值包含特殊字符之一,例如“{”,则无法正确缩进。

我的解决方案(基于 suhas_sm 的方法):

public static String formatString(String text){

    StringBuilder json = new StringBuilder();
    String indentString = "";

    boolean inQuotes = false;
    boolean isEscaped = false;

    for (int i = 0; i < text.length(); i++) {
        char letter = text.charAt(i);

        switch (letter) {
            case '\\':
                isEscaped = !isEscaped;
                break;
            case '"':
                if (!isEscaped) {
                    inQuotes = !inQuotes;
                }
                break;
            default:
                isEscaped = false;
                break;
        }

        if (!inQuotes && !isEscaped) {
            switch (letter) {
                case '{':
                case '[':
                    json.append("\n" + indentString + letter + "\n");
                    indentString = indentString + "\t";
                    json.append(indentString);
                    break;
                case '}':
                case ']':
                    indentString = indentString.replaceFirst("\t", "");
                    json.append("\n" + indentString + letter);
                    break;
                case ',':
                    json.append(letter + "\n" + indentString);
                    break;
                default:
                    json.append(letter);
                    break;
            }
        } else {
            json.append(letter);
        }
    }

    return json.toString();
}
于 2013-12-09T11:19:03.593 回答
2

你想解析它还是简单地显示原始 JSON 响应?如果是前者:

如何在 Android 中解析 JSON

如果要对其进行格式化,可以手动进行:

例子:

{"J":5,"0":"N"}


首先删除“{,}”,将这个数组 '"J":5,"0":"N"' 拆分为 ',' 然后为着色检查一个值是否有引号并相应地选择。只是一个简单的字符串操作。

然后输出:

  • {
  • 带有着色的数组项的 foreach 循环
  • }
于 2013-01-09T10:04:02.147 回答
0

您可以使用XStream,这是一个将对象序列化为 XML 并再次返回的库。
但它也可以用于 JSON,请看这里XStream JSON 教程
更多库可以在这里找到http://www.json.org/

编辑
要在 HTML 中显示,您可以使用 Javascript: JSON.stringify 函数 (JavaScript)

var jsonText = JSON.stringify(myJson, null, '\t'); \\ uses tab indent
document.write(jsonText);
于 2013-01-09T12:06:24.643 回答
0

您可以使用 ObjectMapper。

首先是你将你的字符串转换为一个对象,然后做这样的事情。

String prettyJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);

结果。

{
    "age":100,
    "name":"mkyong.com",
    "messages":["msg 1","msg 2","msg 3"]
}
于 2017-05-04T08:44:54.893 回答
0

您可以使用此方法来美化 JSON。(只是对@Rahul Tiwari 的回答的补充)

private String prettifyJson(String jsonString) {
    JSONObject jsonObject = null;

    try {
        jsonObject = new JSONObject(jsonString);
    } catch (JSONException ignored) {
    }

    try {
        if (jsonObject != null) {
            return jsonObject.toString(4);
        }
    } catch (JSONException ignored) {
    }

    return "empty";
}
于 2021-05-17T07:02:27.377 回答
0

我知道这为时已晚,但这是我最近写的一个解决方案。这将帮助您格式化已经部分格式化的 JSON 字符串。我在此处发布此内容的原因是,当我有一个部分格式化的输入 JSON 时,上述解决方案不起作用。

干得好。https://gist.github.com/rahulrvp/d10d6bea0e0b87883da5b8ce21f96c81

于 2017-01-23T13:28:32.567 回答