Jackson on hyvin yleinen kirjasto JSONin ja serialisoinnin/deserialisoinnin käsittelyyn yleensä Java- ja Spring Boot -pohjaisissa projekteissa.
Jackson käsittelee kiinteistöjen nimet kartoittamalla ne sellaisina kuin ne ovat JSONiin – niin
propertyName
POJOssa on vastaavapropertyName
JSONissa. Tätä käytäntöä noudatetaan myös muunnettaessa JSON POJO:ksi, ja jos nimet eivät täsmää, muuntamista ei voida tehdä.
On kuitenkin monia tapauksia, joissa haluat sarjoitetuilla JSON-ominaisuuksilla olevan erilaiset nimet, kuten muiden palveluiden nimeämiskäytäntöjen standardointi (esim. snake_case
, sen sijasta CamelCase
) tai ristiriitaisia ominaisuuksien nimiä (a Customer
voi olla firstName
, aivan kuin an Agent
– ja raportti voi sisältää molemmat firstName
ominaisuudet ja se on sarjoitettava).
Luomme Book
luokka, muutamalla yksinkertaisella kentällä:
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;
}
}
Muuta JSON-kenttien nimiä Jacksonin kanssa
Kun tavallisesti muunnetaan esiintymää a Book
JSONiin, kirjoitamme objektin arvon JSON-merkkijonona käyttämällä ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Tämä johtaa:
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
- title
, author
ja releaseYear
ovat 1-1-kartoitus title
, author
ja releaseYear
POJO:n kentät. Jos haluat muuttaa JSON-ominaisuuden nimeä ja säilyttää sen sarjoituksen jälkeen, sinun ei tarvitse muuttaa POJOasi! Riittää, kun merkitään asiaankuuluva kenttä @JsonProperty
ja anna JSON-nimi:
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;
}
}
Nyt kun instantoimme objektin ja muunnamme sen JSONiksi:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Koodi johtaa:
{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}
Muutetaanko JSON-kenttien nimet JSON-POJO-muunnoksessa?
On syytä huomata, että nimenmuutos ei ole yksipuolinen. Sama merkintä toimii molempiin suuntiin ja voi yhdistää saapuvan JSONin eri nimillä kelvolliseen objektiin. Esimerkiksi JSON, joka edustaa kirjaa, jossa on book_title
, ei ole kartoitettu title
omaisuus Book
oletuksena, koska ne eivät ole samoja.
Koska olemme huomauttaneet title
as book_title
– muunnos toimii hienosti:
Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);
Tämä johtaa:
Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}
Huomautus: Jotta voit rakentaa objektin JSONista, luokassasi on oltava myös tyhjä konstruktori. Jackson instantoi ensin tyhjän objektin ja täyttää sitten kentät gettereillä ja asettimilla.
Merkitse hakijat ja asettajat @JsonPropertyllä
Haluatko koodata eri nimiä serialisointia ja deserialisointia varten? Voit esimerkiksi sarjottaa Book
JSON-tiedostoksi bt
tarkoittaa kirjan nimeä, mutta käytä JSON:ia sen kanssa book_title
. Voit mukauttaa sen saajia ja asettajia Book
luokka kanssa @JsonProperty
huomautukset:
@JsonProperty("bt")
public String getBt() {
return title;
}
@JsonProperty("book_title")
public void setTitle(String title) {
this.title = title;
}
Tällä tavalla, kun sarjoitetaan, getBt()
menetelmä sarjoittaa title
kuten bt
kenttä JSONissa. Kun luet JSONista (deserializing), sinun on annettava a book_title
, joka kartoitetaan title
.
Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!
Huomautus: molemmat bt
ja book_title
kartoitetaan kohteeseen title
kenttään, mutta tämä ei tee bt
ja book_title
vaihdettavissa. Jackson ei voi muuntaa niiden välillä muuntamatta ensin kieleksi title
.
Nyt voit luoda kirjan, sarjoittaa sen ja tehdä toisen merkkijonon kirjaksi seuraavilla tavoilla:
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);
Tämä johtaa:
{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}
Yhteenveto
Tässä lyhyessä opetusohjelmassa olemme tarkastelleet, kuinka Jackson kartoittaa objektikentät JSON-muotoon ja kuinka voit muuttaa kenttien nimiä ennen sarjoittamista. Olemme myös tutkineet ajatusta käyttää erilaisia JSON-nimiä sarjoitukseen ja deserialointiin käyttämällä @JsonProperty
merkintä menetelmätasolla kenttätason sijaan.