Jackson on Java- ja Spring Boot-põhistes projektides väga levinud raamatukogu JSON-i käsitlemiseks ja serialiseerimiseks/deserialiseerimiseks üldiselt.
Jackson käsitleb atribuutide nimesid, vastendades need JSON-iga nii, nagu need on – nii
propertyName
POJO-s on vastavpropertyName
JSON-is. Seda tava järgitakse ka JSON-i teisendamisel POJO-ks ja kui nimed ei ühti, ei saa teisendada.
Siiski on palju juhtumeid, kus soovite, et serialiseeritud JSON-i atribuutidel oleks erinevad nimed, näiteks muude teenuste nimetamise tavade standardimine (kasutades selliseid juhtumeid nagu snake_case
, selle asemel CamelCase
) või vastuolulised atribuutide nimed (a Customer
võib olla firstName
, just nagu an Agent
– ja aruanne võib sisaldada mõlemat firstName
omadused ja see tuleb serialiseerida).
Loome a Book
klassis, mõne lihtsa väljaga:
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;
}
}
Muutke Jacksoniga JSON-i väljanimesid
Kui tavaliselt teisendate a eksemplari Book
JSON-i, kirjutaksime objekti väärtuse JSON-stringina kasutades ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Selle tulemuseks on:
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
. title
, author
ja releaseYear
on üks-ühele vastendamine title
, author
ja releaseYear
POJO väljad. JSON-i atribuudi nime muutmiseks ja selle säilitamiseks pärast serialiseerimist pole vaja POJO-d muuta! Piisab vastava välja märkimisest @JsonProperty
ja sisestage 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;
}
}
Nüüd, kui me loome objekti ja teisendame selle JSON-iks:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Koodi tulemuseks on:
{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}
Kas muuta JSON-i väljade nimesid JSON-POJO-ks teisenduses?
Väärib märkimist, et nimemuutus ei ole ühepoolne. Sama märkus töötab mõlemal viisil ja võib ühendada erineva nimega sissetuleva JSON-i kehtivaks objektiks. Näiteks JSON, mis esindab raamatut koos book_title
, ei oleks kaardistatud title
vara Book
klassi vaikimisi, kuna need ei ole samad.
Kuna oleme märkusi teinud title
as book_title
- konversioon töötab hästi:
Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);
Selle tulemuseks on:
Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}
Märge: JSON-ist objekti ehitamiseks peab teie klassil olema ka tühi konstruktor. Jackson loob esmalt tühja objekti ja täidab seejärel väljad getterite ja seadistajate abil.
Märkige hankijatele ja seadjatele @JsonProperty abil
Kas soovite serialiseerimiseks ja deserialiseerimiseks erinevaid nimesid kodeerida? Näiteks saate serialiseerida Book
JSON-i koos bt
tähistab raamatu pealkirja, kuid tarbi JSON-i koos book_title
. Saate kohandada selle hankijaid ja seadjaid Book
klass koos @JsonProperty
annotatsioonid:
@JsonProperty("bt")
public String getBt() {
return title;
}
@JsonProperty("book_title")
public void setTitle(String title) {
this.title = title;
}
Sel viisil, kui see on järjestatud, getBt()
meetod serialiseerib title
kui bt
väli JSON-is. JSON-ist lugemisel (deserialiseerimine) peate esitama a book_title
, mis kaardistatakse title
.
Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!
Märge: Mõlemad bt
ja book_title
kaardistatakse title
valdkonnas, kuid see ei tee bt
ja book_title
vahetatavad. Jackson ei saa nende vahel teisendada, kui ta pole teisendanud title
.
Nüüd saate raamatu eksemplari luua, seeriada ja teise stringi deserialiseerida raamatuks, kasutades järgmist:
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);
Selle tulemuseks on:
{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}
Järeldus
Selles lühikeses õpetuses vaatlesime, kuidas Jackson kaardistab objektiväljad JSON-iga ja kuidas saate enne serialiseerimist väljade nimesid muuta. Oleme uurinud ka ideed kasutada serialiseerimiseks ja deserialiseerimiseks erinevaid JSON-nimesid, kasutades @JsonProperty
märkus meetodi tasemel, mitte välja tasemel.