Endre JSON-feltnavn med Jackson i Java

Jackson er et veldig vanlig bibliotek for håndtering av JSON og serialisering/deserialisering generelt i Java- og Spring Boot-baserte prosjekter.

Jackson håndterer eiendomsnavn ved å kartlegge dem slik de er til JSON – altså propertyName i en POJO vil ha en tilsvarende propertyName i JSON. Denne konvensjonen følges også når JSON konverteres til POJO, og hvis navnene ikke samsvarer, kan konverteringen ikke utføres.

Imidlertid er det mange tilfeller der du vil at de serialiserte JSON-egenskapene skal ha forskjellige navn, for eksempel standardisering av navnekonvensjoner for andre tjenester (ved å bruke tilfeller som snake_case, i stedet for CamelCase) eller motstridende egenskapsnavn (a Customer kan ha en firstName, bare som en Agent – og en rapport kan inneholde begge deler firstName egenskaper og må serialiseres).

La oss lage en Book klasse, med noen få enkle felt:

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

Endre JSON-feltnavn med Jackson

Når du vanligvis konverterer en forekomst av en Book inn i JSON, vil vi skrive verdien til objektet som en JSON-streng ved å bruke 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}

De title, author og releaseYear er en 1-til-1-tilordning til title, author og releaseYear feltene til POJO. For å endre navnet på en JSON-egenskap og beholde den etter serialisering, er det ikke nødvendig å endre POJO! Det er nok å kommentere det aktuelle feltet med @JsonProperty, og oppgi 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;
    }
    
}

Nå, 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 endre JSON-feltnavn i JSON-til-POJO-konvertering?

Det er verdt å merke seg at navneendringen ikke er ensidig. Den samme merknaden fungerer begge veier, og kan bygge bro over en innkommende JSON med forskjellige navn til et gyldig objekt. For eksempel en JSON som representerer en bok med book_title, ville ikke bli tilordnet til title eiendommen til Book klasse som standard, siden de ikke er de samme.

Siden vi har kommentert title as book_title – konverteringen fungerer helt 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}

OBS: For å konstruere et objekt fra JSON, må klassen din også ha en tom konstruktør. Jackson instansierer først det tomme objektet, og fyller deretter ut feltene ved å bruke gettere og settere.

Annoter Getters og Setters med @JsonProperty

Vil du kode forskjellige navn for serialisering og deserialisering? Du kan for eksempel serialisere Book inn i en JSON med bt angir bokens tittel, men konsumerer JSON med book_title. Du kan tilpasse getters og settere for Book klasse med @JsonProperty merknader:

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

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

På denne måten, når den serialiseres getBt() metoden vil serialisere title som en bt felt i JSON. Når du leser fra JSON (deserialisering), må du oppgi en book_title, som blir kartlagt til title.

Sjekk ut vår praktiske, praktiske guide for å lære Git, med beste praksis, bransjeaksepterte standarder og inkludert jukseark. Slutt å google Git-kommandoer og faktisk lære den!

OBS: Begge bt og book_title vil bli kartlagt til title felt, men dette gjør det ikke bt og book_title utskiftbare. Jackson vil ikke kunne konvertere mellom dem uten først å konvertere til title.

Nå kan du instansiere en bok, serialisere den og deserialisere en annen streng til en bok 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}

konklusjonen

I denne korte opplæringen har vi tatt en titt på hvordan Jackson kartlegger objektfelt til JSON, og hvordan du kan endre navnet på feltene før serialisering. Vi har også utforsket ideen om å bruke forskjellige JSON-navn for serialisering og deserialisering, ved å bruke @JsonProperty annotering på metodenivå, snarere enn feltnivå.

Tidstempel:

Mer fra Stackabuse