Красивая печать JSON с Джексоном в Java и Spring Boot

Jackson — одна из наиболее распространенных библиотек для работы с сериализацией и десериализацией в Java и Spring Boot, в основном используемая для синтаксического анализа и преобразования между POJO и JSON.

Хотя, если вы работали с Джексоном, вы заметите явное отсутствие красивой печати по умолчанию:

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

В этом кратком руководстве вы узнаете, как красиво печатать JSON с помощью Jackson в стандартной Java и с помощью Spring Boot.

Мы будем работать со строкой JSON и POJO, преобразованным в строку JSON, поскольку они ведут себя по-разному:

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 instance и строка для ввода:

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

Pretty-Print 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 вместо чтения из заданного ввода мы будем выполнять только преобразование объекта в 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
}

Глобальная настройка Pretty-Print

Кроме того, вы можете включить глобальную красивую печать, если это предпочтительное глобальное поведение Джексона для вашего проекта. Это так же просто, как использовать 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 без руководства ObjectMapper создается экземпляр и полагаться на базовый сериализатор, вы можете установить indent_output флаг true в application.properties файл:

spring.jackson.serialization.indent_output=true

Или, в application.yaml:

spring:
  jackson:
    serialization:
      INDENT_OUTPUT: true

Это устанавливает SerializationFeature.INDENT_OUTPUT флаг весной ObjectMapper пример.

Заключение

В этом кратком руководстве мы рассмотрели, как можно красиво распечатать JSON из строки или POJO с помощью Jackson. Мы рассмотрели изменения одиночной печати (когда вы хотите красиво распечатать только один раз) и установили глобальный флаг Джексона для ObjectMapper. Наконец, мы рассмотрели изменение свойств Spring Boot для обеспечения красивой печати с помощью Jackson.

Отметка времени:

Больше от Стекабьюс