如何漂亮地打印一个复杂的Java对象(例如,使用作为对象集合的字段)?[已关闭]

我正在寻找一个库函数(理想情况下来自常用的框架,例如Spring,Guava,Apache Commons等),它可以很好地打印任何Java对象的值。

这是一个一般性问题,而不是一个具体问题。在StackOverflow上看到了类似的问题,其中一个常见的答案是“在类上实现你自己的方法”,但这个选项并不总是实用的 - 我正在寻找一种通用方法来做到这一点,我遇到的任何对象可能来自第三方代码。另一个建议是使用Apache Commons的RefectionToStringBuilder,例如:toString()

new ReflectionToStringBuilder(complexObject, new RecursiveToStringStyle()).toString()

但这有有限的用途 - 例如,当它遇到一个集合时,它倾向于输出这样的东西:

java.util.ArrayList@fcc7ab1[size=1]

一个实际的用例示例是记录从 JGit 的 pushCommand.call() 方法返回的 Iterable<PushResult> - 如果发布答案,请确保它适用于此对象以及任何其他复杂对象。


答案 1

你可以尝试使用Gson。它还序列化数组,映射或其他任何东西....

MyObject myObject = new MyObject();
Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
gson.toJson(myObject);

对于反序列化用途:

gson.fromJson(MyObject.class);

对于类型化地图,请参阅以下答案: Gson:有没有更简单的方法来序列化地图


答案 2

您可以使用 Jackson 类 is 将数据与 json 绑定。你可以像下面这样使用它:ObjectMapper

ObjectMapper mapper = new ObjectMapper();

您可以将json保存到对象中,如下所示

Object json = mapper.readValue(input,object.class);

你可以把它写在字符串变量中

String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json);

它应该工作正常。