在 Java 和 Spring Boot 中使用 Jackson 打印漂亮的 JSON

Jackson 是 Java 和 Spring Boot 中最常用的序列化和反序列化库之一,主要用于 POJO 和 JSON 之间的解析和转换。

但是,如果您与 Jackson 合作过,您会注意到默认情况下明显缺乏漂亮的打印:

{Task 1=In_Progress, Task 2=Done, Task 3=Planned}

在这个简短的教程中,您将学习如何在标准 Java 和 Spring Boot 中使用 Jackson 打印 JSON。

我们将使用 JSON 字符串和转换为 JSON 字符串的 POJO,因为它们的行为不同:

public class Book {
    private String title;
    private String author;
    private int releaseYear;

    public Book(String title, String author, int releaseYear) {
        this.title = title;
        this.author = author;
        this.releaseYear = releaseYear;
    }
    

让我们实例化一个 Book 实例,以及输入的字符串:

String inputString = "{n" +
        ""Task 1" : "In_Progress",n" +
        ""Task 2" : "Done",n" +
        ""Task 3" : "Planned"n" +
        "}";

Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);

与杰克逊一起漂亮打印 JSON

如果您只想在一次调用中简单地打印一次,而不是设置全局打印标​​志 - 您可以简单地使用 writerWithDefaultPrettyPrinter() 在将值写入字符串之前调用:

ObjectMapper mapper = new ObjectMapper();

Object jsonString = mapper.readValue(inputString, Object.class);
String indentedString = mapper.writerWithDefaultPrettyPrinter()
                              .writeValueAsString(jsonString);
        
        
System.out.println(jsonString);
System.out.println(indentedString);

输入字符串是从 (JSON-to-Object) 读取的,并且这个对象的值被写回字符串,使用漂亮打印 (Object-to-JSON):

{Task 1=In_Progress, Task 2=Done, Task 3=Planned}

{
  "Task 1" : "In_Progress",
  "Task 2" : "Done",
  "Task 3" : "Planned"
}

或者,当使用 readTree(), 所结果的 JsonNode 有一个 toPrettyString() 函数作为将字符串转换为漂亮打印 JSON 的一种非常简单的方法:

ObjectMapper mapper = new ObjectMapper();
Object jsonString = mapper.readTree(inputString).toPrettyString();
System.out.println(jsonString);

这是格式化输入 JSON 字符串的一种快速简单的方法! 使用 POJO 时,我们不会从给定的输入中读取数据,而是只执行 Object-to-JSON 转换并启用漂亮打印:

ObjectMapper mapper = new ObjectMapper();

String jsonBook = mapper.writeValueAsString(book);
String indentedBook = mapper.writerWithDefaultPrettyPrinter()
                            .writeValueAsString(book);


System.out.println(jsonBook);
System.out.println(indentedBook);
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
{
  "title" : "Our Mathematical Universe",
  "author" : "Max Tegmark",
  "releaseYear" : 2014
}

全局漂亮打印设置

或者,您可以启用全局漂亮打印,如果这是 Jackson 对您的项目更可取的全局行为。 这就像使用 enable() 的方法 ObjectMapper() 实例化它时的实例:

ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);

一旦您将对象编写为 JSON 字符串 - 默认情况下将启用漂亮打印:

Object jsonString = mapper.readValue(inputString, Object.class);
String indentedString = mapper.writeValueAsString(jsonString);

System.out.println(jsonString);
System.out.println(indentedString);

结果是:

{Task 1=In_Progress, Task 2=Done, Task 3=Planned}
{
  "Task 1" : "In_Progress",
  "Task 2" : "Done",
  "Task 3" : "Planned"
}

使用 POJO:

String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!

{
  "title" : "Our Mathematical Universe",
  "author" : "Max Tegmark",
  "releaseYear" : 2014
}

如果漂亮打印是一种常见的显示格式,那么这种方法就不会那么冗长了。

带有 Spring Boot 的漂亮印花 Jackson

如果您使用的是 Spring Boot,则无需手册 ObjectMapper 正在创建的实例并依赖于底层序列化程序,您可以设置 indent_output 标记为 true ,在 application.properties 文件:

spring.jackson.serialization.indent_output=true

或者,在 application.yaml:

spring:
  jackson:
    serialization:
      INDENT_OUTPUT: true

这设置了 SerializationFeature.INDENT_OUTPUT 春天的旗帜 ObjectMapper 实例。

结论

在这个简短的教程中,我们了解了如何使用 Jackson 从字符串或 POJO 中漂亮地打印 JSON。 我们已经探索了单打印更改(当您只想打印一次时)并为 ObjectMapper. 最后,我们查看了更改 Spring Boot 属性以启用 Jackson 的漂亮打印。

时间戳记:

更多来自 堆栈滥用