Skift JSON-feltnavn med Jackson i Java

Jackson er et meget almindeligt bibliotek til håndtering af JSON og serialisering/deserialisering generelt i Java- og Spring Boot-baserede projekter.

Jackson håndterer ejendomsnavne ved at kortlægge dem, som de er til JSON – altså propertyName i en POJO vil have en tilsvarende propertyName i JSON. Denne konvention følges også, når JSON konverteres til POJO, og hvis navnene ikke stemmer overens, kan konverteringen ikke udføres.

Der er dog mange tilfælde, hvor du ønsker, at de serialiserede JSON-egenskaber skal have forskellige navne, såsom standardisering af navnekonventioner for andre tjenester (ved at bruge tilfælde som f.eks. snake_case, i stedet for CamelCase) eller modstridende egenskabsnavne (a Customer kan have en firstName, bare som en Agent – og en rapport kan indeholde begge dele firstName egenskaber og skal serialiseres).

Lad os skabe en Book klasse, med et par enkle felter:

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

Skift JSON-feltnavne med Jackson

Når man normalt konverterer en forekomst af en Book ind i JSON, ville vi skrive værdien af ​​objektet som en JSON-streng vha ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
        
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

Dette resulterer i:

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

title, author , releaseYear er en 1-til-1 mapping til title, author , releaseYear områder af POJO. For at ændre navnet på en JSON-ejendom og beholde den efter serialisering, er der ingen grund til at ændre din POJO! Det er nok at annotere det relevante felt med @JsonProperty, og angiv JSON-navnet:

public class Book {
    @JsonProperty("book_title")
    private String title;
    @JsonProperty("book_author")
    private String author;
    @JsonProperty("book_release_year")
    private int releaseYear;
    
    public Book(){}
    public Book(String title, String author, int releaseYear) {
        this.title = title;
        this.author = author;
        this.releaseYear = releaseYear;
    }
    
}

Nu, når vi instansierer objektet og konverterer det til JSON:

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

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

Koden resulterer i:

{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}

Vil du ændre JSON-feltnavne i JSON-til-POJO-konvertering?

Det er værd at bemærke, at navneændringen ikke er ensidig. Den samme annotation virker begge veje og kan bygge bro mellem en indgående JSON med forskellige navne til et gyldigt objekt. For eksempel en JSON, der repræsenterer en bog med book_title, ville ikke blive knyttet til title ejendom af Book klasse som standard, da de ikke er ens.

Siden vi har kommenteret title as book_title – konverteringen fungerer fint:

Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);

Dette resulterer i:

Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}

Bemærk: For at konstruere et objekt fra JSON skal din klasse også have en tom konstruktør. Jackson instansierer først det tomme objekt og udfylder derefter felterne ved hjælp af gettere og settere.

Annoter Getters og Setters med @JsonProperty

Vil du kode forskellige navne til serialisering og deserialisering? For eksempel kan du serialisere Book ind i en JSON med bt angiver bogens titel, men indtager JSON med book_title. Du kan tilpasse getters og sættere af Book klasse med @JsonProperty anmærkninger:

@JsonProperty("bt")
public String getBt() {
    return title;
}

@JsonProperty("book_title")
public void setTitle(String title) {
    this.title = title;
}

På denne måde, når den serialiseres getBt() metode vil serialisere title som en bt felt i JSON. Når du læser fra JSON (deserialisering), skal du angive en book_title, der bliver kortlagt til title.

Tjek vores praktiske, praktiske guide til at lære Git, med bedste praksis, brancheaccepterede standarder og inkluderet snydeark. Stop med at google Git-kommandoer og faktisk lærer det!

Bemærk: Både bt , book_title vil blive kortlagt til title felt, men det gør det ikke bt , book_title udskiftelig. Jackson vil ikke være i stand til at konvertere mellem dem uden først at konvertere til title.

Nu kan du instansiere en bog, serialisere den og deserialisere en anden streng til en bog med:

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


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


String input = "{"author":"Max Tegmark","releaseYear":2017,"book_title":"Life 3.0"}";
Book bookReconstructed = mapper.readValue(input, Book.class);
System.out.print(bookReconstructed);

Dette resulterer i:

{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}

Konklusion

I denne korte tutorial har vi taget et kig på, hvordan Jackson kortlægger objektfelter til JSON, og hvordan du kan ændre navnet på felterne før serialisering. Vi har også undersøgt ideen om at bruge forskellige JSON-navne til serialisering og deserialisering ved hjælp af @JsonProperty anmærkning på metodeniveau i stedet for feltniveau.

Tidsstempel:

Mere fra Stablemisbrug