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 tilsvarendepropertyName
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å.