如何用Java漂亮地打印现有的JSON数据?

如何用Java漂亮地打印现有的JSON数据?,java,json,formatting,pretty-print,Java,Json,Formatting,Pretty Print,我有一个紧凑的JSON字符串,我想在Java中很好地格式化它,而不必首先对它进行反序列化——例如,就像它那样。有没有提供这种服务的图书馆 类似的XML解决方案也很好。我认为,对于打印内容来说,了解其结构非常有帮助 要获得结构,你必须先完成它。因此,我不认为这比首先解析JSON字符串,然后使用上面评论中提到的漂亮打印方法容易得多 当然,您可以对任何喜欢的JSON库执行类似操作。如果您使用jackson,您可以通过在ObjectMapper中配置序列化功能来轻松实现这一点: com.fasterxm

我有一个紧凑的JSON字符串,我想在Java中很好地格式化它,而不必首先对它进行反序列化——例如,就像它那样。有没有提供这种服务的图书馆


类似的XML解决方案也很好。

我认为,对于打印内容来说,了解其结构非常有帮助

要获得结构,你必须先完成它。因此,我不认为这比首先解析JSON字符串,然后使用上面评论中提到的漂亮打印方法容易得多


当然,您可以对任何喜欢的JSON库执行类似操作。

如果您使用jackson,您可以通过在
ObjectMapper中配置
序列化功能来轻松实现这一点:

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

mapper.configure(SerializationFeature.INDENT_OUTPUT, true);

mapper.writeValueAsString(<yourObject>);
com.fasterxml.jackson.databind.ObjectMapper mapper=new ObjectMapper();
configure(SerializationFeature.INDENT_输出,true);
writeValueAsString();
就这样

在一行中:

String niceFormattedJson = JsonWriter.formatJson(jsonString)

json io库()是一个小型(75K)库,除了JDK之外没有其他依赖项

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

int spacesToIndentEachLevel = 2;
new JSONObject(jsonString).toString(spacesToIndentEachLevel);

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

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

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

输出

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

使用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时,可以使用它。

库中有方法
U.formatJson(json)
U.formatXml(xml)

通过漂亮的打印,您是指颜色代码、缩进还是两者都有?JSONObject有一个
toString(int)
这里为漂亮的打印提供间距。@精英先生:我需要反序列化JSON数据才能得到JSONObject,不是吗?@neu242,不,JSONObject已经是JSON数据了。为什么要这样做?GWT2.5.0在JSONObject上没有toString(int)这个库使用什么?这不是一个很有帮助的答案。@Andrew Backer,这不是图书馆。正如Heath Borders所说,它内置于Android库中。我已经测试过了,它在没有任何库的情况下工作得很好。嗯。。。我不是为Android开发的,我也没有部署到JavaEE容器。。。因此需要澄清。感谢您添加:)因此,对于像我这样的人来说,发布一个针对SE的java应用程序,它将是一个库,如
org.json:json:20090211
?对于我们这些使用Android的人来说,这非常有用,在文档的快速查看中并不十分清楚。没想到它是内置的。
org.json.JSONObject
没有内置到JavaEE中。
JsonObject
JSON-P
库是
javax.JSON.JsonObject
。使用了这个小库,对输出格式做了一些修改。感谢您让我知道这一点。这不仅是第一个在我的环境中工作的解决方案,它最终证实了我知道如何使用Gradle正确地拉入第三方库!祝你愉快,谢谢!我希望这个小小的库能够在不进行反序列化的情况下重新格式化现有的JSON字符串,但查看源代码证明我错了。此formatJson(..)方法在内部反序列化JSON字符串,然后将其序列化回格式化的JSON字符串。现在不推荐使用实例化
JsonParser
。使用静态方法
JsonParser.parseString(json\u String\u to\u print)
代替。这是正确的答案让我们投票吧!!这是必须接受的答案!链接断了。
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(my_bean);
{
  "name": "mkyong",
  "age": 35,
  "position": "Founder",
  "salary": 10000,
  "skills": [
    "java",
    "python",
    "shell"
  ]
}
String json_String_to_print = ...
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
return gson.toJson(jp.parse(json_String_to_print));