【问题标题】:How do I pretty-print existing JSON data with Java? [closed]如何使用 Java 漂亮地打印现有的 JSON 数据? [关闭]
【发布时间】:2011-09-05 08:00:27
【问题描述】:

我有一个紧凑的 JSON 字符串,我想在 Java 中很好地格式化它,而不必先反序列化它——例如就像jsonlint.org 一样。有没有提供这个的库?

类似的 XML 解决方案也不错。

【问题讨论】:

  • 漂亮的打印是指颜色代码、缩进还是两者兼而有之?
  • JSONObject 有一个toString(int),您可以在其中为漂亮的打印提供间距。
  • @精英绅士:我需要反序列化 JSON 数据来获取 JSONObject,不是吗?
  • @neu242,不,JSONObject 已经是 JSON 数据了。你为什么要这么做?
  • GWT 2.5.0 在 JSONObject 上没有 toString(int)

标签: java json formatting pretty-print


【解决方案1】:

我认为对于打印漂亮的东西,了解它的结构非常有帮助。

要获得结构,您必须parse 它。因此,我认为这并不比首先解析您拥有的 JSON 字符串,然后使用上面 cmets 中提到的漂亮打印方法 toString 容易得多。

当然,你可以对任何你喜欢的 JSON 库做类似的事情。

【讨论】:

  • 链接已损坏。
【解决方案2】:

如果您使用的是 jackson,您可以通过在 ObjectMapper 中配置 SerializationFeature 轻松实现此目的:

com.fasterxml.jackson.databind.ObjectMapper mapper = new ObjectMapper();

mapper.configure(SerializationFeature.INDENT_OUTPUT, true);

mapper.writeValueAsString(<yourObject>);

就是这样。

【讨论】:

    【解决方案3】:

    一行:

    String niceFormattedJson = JsonWriter.formatJson(jsonString)
    

    System.out.println(JsonWriter.formatJson(jsonString.toString()));
    

    json-io 库 (https://github.com/jdereg/json-io) 是一个小型 (75K) 库,除了 JDK 之外没有其他依赖项。

    除了打印精美的 JSON 之外,您还可以将 Java 对象(带有循环的整个 Java 对象图)序列化为 JSON,并读入它们。

    【讨论】:

    • 使用了这个小库,对输出格式进行了一些修改。感谢您让我知道。
    • 这不仅是在我的环境中工作的第一个解决方案,它最终证实了我知道如何使用 Gradle 正确地拉入第三方库!美好的一天,谢谢!
    • 我希望这个小型库能够重新格式化现有的 JSON 字符串而不先对其进行反序列化,但查看源代码证明我错了。此 formatJson(..) 方法在内部反序列化 JSON 字符串,然后将其序列化回格式化的 JSON 字符串。
    【解决方案4】:
    int spacesToIndentEachLevel = 2;
    new JSONObject(jsonString).toString(spacesToIndentEachLevel);
    

    使用org.json.JSONObject(JavaEE 和 Android 内置)

    【讨论】:

    • 这个使用什么库?因为这不是一个很有帮助的答案。
    • @Andrew Backer,这不是图书馆。正如 Heath Borders 所说,它内置于 Android 库中。我已经对此进行了测试,它无需任何库即可完美运行。
    • 嗯...我不是为 Android 开发,也没有部署到 java EE 容器...因此需要澄清。感谢您添加 :) 所以对于像我这样的人来说,分发一个针对 SE 的 java 应用程序,它将是一个库,例如 org.json:json:20090211?
    • 对于我们这些使用 Android 的人来说,这非常有用,但在快速查看文档时并不是很清楚。没想到是内置的。
    • org.json.JSONObject 未内置于 JavaEEJsonObjectJSON-P 库是 javax.json.JsonObject
    【解决方案5】:

    我找到了一个非常简单的解决方案:

    <dependency>
        <groupId>com.cedarsoftware</groupId>
        <artifactId>json-io</artifactId>
        <version>4.5.0</version>
    </dependency>
    

    Java 代码:

    import com.cedarsoftware.util.io.JsonWriter;
    //...
    String jsonString = "json_string_plain_text";
    System.out.println(JsonWriter.formatJson(jsonString));
    

    【讨论】:

      【解决方案6】:

      使用 gson。 https://www.mkyong.com/java/how-to-enable-pretty-print-json-output-gson/

      Gson gson = new GsonBuilder().setPrettyPrinting().create();
      String json = gson.toJson(my_bean);
      

      输出

      {
        "name": "mkyong",
        "age": 35,
        "position": "Founder",
        "salary": 10000,
        "skills": [
          "java",
          "python",
          "shell"
        ]
      }
      

      【讨论】:

        【解决方案7】:

        gson 的另一种使用方式:

        String json_String_to_print = ...
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        JsonParser jp = new JsonParser();
        return gson.toJson(jp.parse(json_String_to_print));
        

        当你没有 susemi99 的帖子中的 bean 时可以使用它。

        【讨论】:

        • 实例化 JsonParser 现在已弃用。请改用静态方法JsonParser.parseString(json_String_to_print)
        • 这是正确的答案,让我们投票吧!!
        • 这是必须接受的答案!
        【解决方案8】:

        Underscore-java 库有方法 U.formatJson(json)U.formatXml(xml)

        【讨论】:

          猜你喜欢
          • 2013-10-03
          • 2011-08-05
          • 2011-08-20
          • 2015-07-03
          相关资源
          最近更新 更多