Pretty-Printing JSON med Jackson i Java och Spring Boot

Jackson är ett av de vanligaste biblioteken för att arbeta med serialisering och deserialisering i Java och Spring Boot, som främst används för att analysera och konvertera mellan POJOs och JSON.

Men om du har arbetat med Jackson kommer du att märka en tydlig brist på snyggt tryck som standard:

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

I den här korta handledningen får du lära dig hur du snyggt skriver ut JSON med Jackson i standard Java och med Spring Boot.

Vi kommer att arbeta med en JSON-sträng och en POJO konverterad till en JSON-sträng, eftersom dessa beter sig annorlunda:

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

Låt oss instansiera en Book instans och en sträng för indata:

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

Om du bara vill skriva ut en gång, i ett enda samtal, istället för att ställa in den globala utskriftsflaggan – kan du helt enkelt använda writerWithDefaultPrettyPrinter() ring innan du skriver ett värde som en sträng:

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

Inmatningssträngen lästes från (JSON-to-Object), och värdet för detta objekt skrevs tillbaka till en sträng med pretty-printing (Object-to-JSON):

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

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

Alternativt vid användning readTree(), det resulterande JsonNode har en toPrettyString() funktion som fungerar som ett utmärkt enkelt sätt att konvertera strängar till snyggt tryckt JSON:

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

Detta är ett snabbt och enkelt sätt att formatera en indata-JSON-sträng! När vi arbetar med POJO:er, istället för att läsa från en given indata, kommer vi bara att utföra objekt-till-JSON-konvertering och aktivera pretty-printing:

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
}

Global Pretty-Print-inställning

Alternativt kan du aktivera global pretty-printing, om det är Jacksons globala beteende att föredra för ditt projekt. Detta är lika enkelt som att använda enable() metod för ObjectMapper() exempel när du instansierar det:

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

Så fort du skriver ett objekt som en JSON-sträng – är pretty-printing aktiverat som standard:

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

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

Detta resulterar i:

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

Med POJO:s:

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

Kolla in vår praktiska, praktiska guide för att lära dig Git, med bästa praxis, branschaccepterade standarder och medföljande fuskblad. Sluta googla Git-kommandon och faktiskt lära Det!

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

Detta tillvägagångssätt är avsevärt mindre utförligt om pretty-printing är ett vanligt visningsformat.

Pretty-Printing Jackson med Spring Boot

Om du använder Spring Boot, utan manual ObjectMapper instans som skapas och lita på den underliggande serializern, kan du ställa in indent_output flagga till true i application.properties fil:

spring.jackson.serialization.indent_output=true

Eller i application.yaml:

spring:
  jackson:
    serialization:
      INDENT_OUTPUT: true

Detta ställer in SerializationFeature.INDENT_OUTPUT flagga på vårens ObjectMapper exempel.

Slutsats

I den här korta handledningen har vi tagit en titt på hur du kan snyggt skriva ut JSON från en sträng eller POJO med Jackson. Vi har utforskat ändringar i enstaka tryck (när du bara vill snygga ut en gång) och ställer in den globala Jackson-flaggan för ObjectMapper. Slutligen tog vi en titt på att ändra Spring Boot-egenskaper för att möjliggöra snygg utskrift med Jackson.

Tidsstämpel:

Mer från Stackabuse