Pretty-Printing JSON z Jacksonem w Javie i Spring Boot

Jackson jest jedną z najpopularniejszych bibliotek do pracy z serializacją i deserializacją w Javie i Spring Boot, używaną głównie do analizowania i konwertowania między POJO a JSON.

Chociaż, jeśli pracowałeś z Jacksonem, zauważysz wyraźny brak ładnego drukowania domyślnie:

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

W tym krótkim samouczku dowiesz się, jak ładnie wydrukować JSON za pomocą Jacksona w standardowej Javie i za pomocą Spring Boot.

Będziemy pracować z ciągiem JSON i POJO przekonwertowanym na ciąg JSON, ponieważ zachowują się one inaczej:

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

Stwórzmy instancję Book instancję i ciąg dla danych wejściowych:

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 z Jackson Once

Jeśli chcesz po prostu ładnie wydrukować raz, w jednym wywołaniu, zamiast ustawiać globalną flagę drukowania – możesz po prostu użyć writerWithDefaultPrettyPrinter() wywołaj przed zapisaniem wartości jako ciągu:

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

Ciąg wejściowy został odczytany z (JSON-to-Object), a wartość tego obiektu została ponownie zapisana w ciągu, używając ładnego drukowania (Object-to-JSON):

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

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

Alternatywnie, gdy używasz readTree(), wynikowy JsonNode ma toPrettyString() funkcja, która służy jako świetny prosty sposób na konwersję ciągów do ładnie wydrukowanego JSON:

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

To szybki i prosty sposób na sformatowanie wejściowego ciągu JSON! Podczas pracy z POJO, zamiast czytać z danych wejściowych, wykonamy tylko konwersję Object-to-JSON i włączymy ładne drukowanie:

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
}

Globalne ustawienie ładnego drukowania

Alternatywnie, możesz włączyć globalne ładne drukowanie, jeśli jest to preferowane globalne zachowanie Jacksona dla twojego projektu. Jest to tak proste, jak użycie enable() metoda ObjectMapper() instancja, gdy tworzysz jego instancję:

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

Gdy tylko napiszesz obiekt jako ciąg JSON – ładne drukowanie będzie domyślnie włączone:

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

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

To skutkuje:

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

Z POJO:

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

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

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

To podejście jest znacznie mniej gadatliwe, jeśli ładne drukowanie jest powszechnym formatem wyświetlania.

Jackson z ładnym nadrukiem i wiosennym butem

Jeśli używasz Spring Boot, bez instrukcji ObjectMapper tworzona instancja i polegać na bazowym serializatorze, możesz ustawić indent_output flaga do true application.properties file:

spring.jackson.serialization.indent_output=true

Lub w application.yaml:

spring:
  jackson:
    serialization:
      INDENT_OUTPUT: true

To określa SerializationFeature.INDENT_OUTPUT flaga na wiosnę ObjectMapper instancja.

Wnioski

W tym krótkim samouczku przyjrzeliśmy się, jak można ładnie wydrukować JSON z ciągu lub POJO za pomocą Jacksona. Zbadaliśmy zmiany dotyczące pojedynczego wydruku (kiedy chcesz wydrukować tylko raz) i ustawienie globalnej flagi Jackson dla ObjectMapper. Na koniec przyjrzeliśmy się zmianie właściwości Spring Boot, aby umożliwić ładne drukowanie w Jackson.

Znak czasu:

Więcej z Nadużycie stosu