Jackson je zelo pogosta knjižnica za obdelavo JSON in serializacijo/deserializacijo na splošno v projektih, ki temeljijo na Javi in Spring Boot.
Jackson obravnava imena lastnosti tako, da jih preslika, kakršna so, v JSON – torej
propertyName
v POJO bo imel ustrezenpropertyName
v JSON. Ta konvencija se upošteva tudi pri pretvorbi JSON v POJO in če se imena ne ujemata, pretvorbe ni mogoče izvesti.
Vendar pa obstaja veliko primerov, v katerih bi želeli, da imajo serializirane lastnosti JSON različna imena, na primer standardizirana pravila poimenovanja za druge storitve (z uporabo primerov, kot je snake_case
, namesto CamelCase
) ali nasprotujoča si imena lastnosti (a Customer
lahko imajo firstName
, samo kot Agent
– in poročilo lahko vsebuje oboje firstName
lastnosti in ga je treba serializirati).
Ustvarimo Book
razred z nekaj preprostimi polji:
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;
}
}
Spremenite imena polj JSON z Jacksonom
Pri navadni pretvorbi primerka a Book
v JSON, bi vrednost predmeta zapisali kot niz JSON z uporabo ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Rezultat tega je:
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
O title
, author
in releaseYear
so preslikava 1 proti 1 v title
, author
in releaseYear
polja POJO. Če želite spremeniti ime lastnosti JSON in ga obdržati po serializaciji, ni treba spreminjati POJO! Dovolj je, da označite ustrezno polje z @JsonProperty
in vnesite ime JSON:
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;
}
}
Zdaj, ko instanciramo objekt in ga pretvorimo v JSON:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Rezultat kode je:
{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}
Spremeniti imena polj JSON pri pretvorbi JSON v POJO?
Omeniti velja, da sprememba imena ni enostranska. Ista opomba deluje v obe smeri in lahko premosti dohodni JSON z različnimi imeni v veljaven objekt. Na primer, JSON, ki predstavlja knjigo z book_title
, ne bi bilo preslikano v title
lastnina Book
razred privzeto, saj nista enaka.
Ker smo dodali opombe title
as book_title
– pretvorba deluje dobro:
Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);
Rezultat tega je:
Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}
Opomba: Če želite zgraditi objekt iz JSON, mora imeti vaš razred tudi prazen konstruktor. Jackson najprej instancira prazen predmet, nato pa zapolni polja s pomočjo pridobivalnikov in nastavljalcev.
Označite pridobivalnike in nastavitve z @JsonProperty
Ali želite kodirati različna imena za serializacijo in deserializacijo? Na primer, lahko serializirate Book
v JSON z bt
označujejo naslov knjige, vendar uporabljajo JSON z book_title
. Prilagodite lahko pridobivalnike in nastavljalce Book
razred z @JsonProperty
opombe:
@JsonProperty("bt")
public String getBt() {
return title;
}
@JsonProperty("book_title")
public void setTitle(String title) {
this.title = title;
}
Na ta način, ko je serijski, getBt()
metoda bo serializirala title
kot bt
polje v JSON. Pri branju iz JSON (deserializacija) boste morali posredovati a book_title
, ki se preslika v title
.
Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!
Opomba: oba bt
in book_title
bodo preslikani v title
polje, vendar to ne pomeni bt
in book_title
zamenljivi. Jackson ne bo mogel pretvarjati med njima, ne da bi se prej pretvoril v title
.
Zdaj lahko ustvarite primerek knjige, jo serializirate in deserializirate drug niz v knjigo z:
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);
Rezultat tega je:
{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}
zaključek
V tej kratki vadnici smo si ogledali, kako Jackson preslika polja predmetov v JSON in kako lahko spremenite ime polj pred serializacijo. Raziskali smo tudi zamisel o uporabi različnih imen JSON za serializacijo in deserializacijo z uporabo @JsonProperty
opombo na ravni metode in ne na ravni polja.