【问题标题】:How to set formatted JSON response string in a TextView?如何在 TextView 中设置格式化的 JSON 响应字符串?
【发布时间】:2013-01-09 09:57:33
【问题描述】:

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

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

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

P.S:最好是彩色格式。

总之..

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

【问题讨论】:

  • JSON 本质上是一个字符串,所以因为TextViews 显示字符串我没有看到你的问题。你真正想要的输出是什么。您能否将其添加到问题中。颜色格式化?
  • 我得到的响应是一个单行字符串(没有新行,没有缩进) - 很长。如果我不格式化直接显示,是不可读的。

标签: java android json textview


【解决方案1】:

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

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();
}

【讨论】:

  • #suhas_sm High5 兄弟。干得好!
【解决方案2】:

更简单的方法,有一个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

【讨论】:

    【解决方案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();
    }
    

    【讨论】:

      【解决方案4】:

      您想解析它还是只显示原始 JSON 响应?如果是前者:

      How to parse JSON in Android

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

      示例:

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


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

      然后输出:

      • {
      • 带有颜色的数组项的foreach循环
      • }

      【讨论】:

      • 我不想解析它。我想在格式化后简单地显示原始 JSON 响应——就像它在 json.online.parse.fr 中格式化一样
      • 所以唯一的解决方案是使用正则表达式并手动执行?一些 JSON 响应的长度足以容纳所有 JSON 类型。
      • 在编程中永远不会只有一种解决方案。但我会说这是我想到的最简单的方法。它不需要超过 20 行代码(不包括 JSON 请求);如果您不确定所有 JSON 类型,只需添加一个处理所有其他异常的“默认”案例。仅处理,例如,用于着色的字符串、数组和数字,就足够了。
      • 嗯,'/t' ? :P 更多信息?
      【解决方案5】:

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

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

      var jsonText = JSON.stringify(myJson, null, '\t'); \\ uses tab indent
      document.write(jsonText);
      

      【讨论】:

        【解决方案6】:

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

        给你。 https://gist.github.com/rahulrvp/d10d6bea0e0b87883da5b8ce21f96c81

        【讨论】:

          【解决方案7】:

          您可以使用 ObjectMapper。

          首先是将字符串转换为对象,然后执行类似的操作。

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

          结果。

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

          【讨论】:

            【解决方案8】:

            您可以使用此方法来美化 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";
            }
            

            【讨论】:

              猜你喜欢
              • 2013-07-28
              • 1970-01-01
              • 2023-03-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多