Jackson este o bibliotecă foarte comună pentru gestionarea JSON și serializarea/deserializarea în general în proiectele bazate pe Java și Spring Boot.
Jackson gestionează numele proprietăților mapându-le așa cum sunt în JSON – deci
propertyName
într-un POJO va avea o corespondențăpropertyName
în JSON. Această convenție este urmată și la conversia JSON în POJO, iar dacă numele nu se potrivesc, conversia nu se poate face.
Cu toate acestea, există multe cazuri în care ați dori ca proprietățile JSON serializate să aibă nume diferite, cum ar fi standardizarea convențiilor de denumire pentru alte servicii (folosind cazuri precum snake_case
, in loc de CamelCase
) sau nume de proprietate conflictuale (a Customer
poate avea un firstName
, la fel ca un Agent
– și un raport poate conține ambele firstName
proprietăți și trebuie serializate).
Să creăm un Book
clasă, cu câteva câmpuri simple:
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;
}
}
Schimbați numele câmpurilor JSON cu Jackson
Când convertiți de obicei o instanță a unui Book
în JSON, vom scrie valoarea obiectului ca șir JSON folosind ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Rezultă:
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
title
, author
și releaseYear
sunt o mapare 1-la-1 la title
, author
și releaseYear
câmpurile POJO. Pentru a schimba numele unei proprietăți JSON și a o păstra după serializare, nu este nevoie să vă schimbați POJO! Este suficient să adnotati câmpul relevant cu @JsonProperty
și furnizați numele 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;
}
}
Acum, când instanțiem obiectul și îl convertim în JSON:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Codul are ca rezultat:
{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}
Schimbați numele câmpurilor JSON în conversia JSON în POJO?
Este de remarcat faptul că schimbarea numelui nu este unilaterală. Aceeași adnotare funcționează în ambele sensuri și poate conecta un JSON primit cu nume diferite într-un obiect valid. De exemplu, un JSON care reprezintă o carte cu book_title
, nu ar fi mapat la title
proprietate a Book
clasa implicită, deoarece nu sunt la fel.
Din moment ce am adnotat title
as book_title
– conversia funcționează foarte bine:
Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);
Rezultă:
Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}
Notă: Pentru a construi un obiect din JSON, clasa dvs. trebuie să aibă și un constructor gol. Jackson instanțiază mai întâi obiectul gol, apoi populează câmpurile folosind getters și setters.
Adnotă Getters și Setters cu @JsonProperty
Doriți să codificați nume diferite pentru serializare și deserializare? De exemplu, puteți serializa Book
într-un JSON cu bt
indicând titlul cărții, dar consumați JSON cu book_title
. Puteți personaliza getter-urile și setter-urile Book
clasa cu @JsonProperty
adnotări:
@JsonProperty("bt")
public String getBt() {
return title;
}
@JsonProperty("book_title")
public void setTitle(String title) {
this.title = title;
}
În acest fel, atunci când este serializat, getBt()
metoda va serializa title
ca o bt
câmp în JSON. Când citiți din JSON (deserializare), va trebui să furnizați a book_title
, care este mapat la title
.
Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!
Notă: Ambele bt
și book_title
va fi mapat la title
câmp, dar asta nu face bt
și book_title
interschimbabile. Jackson nu va putea converti între ele fără a se converti mai întâi la title
.
Acum, puteți să instanțiați o carte, să o serializați și să deserializați un alt String într-o carte cu:
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);
Rezultă:
{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}
Concluzie
În acest scurt tutorial, am aruncat o privire asupra modului în care Jackson mapează câmpurile obiectelor în JSON și cum puteți schimba numele câmpurilor înainte de serializare. De asemenea, am explorat ideea de a folosi diferite nume JSON pentru serializare și deserializare, folosind @JsonProperty
adnotare la nivel de metodă, mai degrabă decât la nivel de câmp.