Jackson è una libreria molto comune per la gestione di JSON e serializzazione/deserializzazione in generale nei progetti basati su Java e Spring Boot.
Jackson gestisce i nomi delle proprietà mappandoli come sono su JSON, quindi
propertyName
in un POJO avrà un corrispondentepropertyName
in JSON. Questa convenzione viene seguita anche durante la conversione da JSON a POJO e, se i nomi non corrispondono, la conversione non può essere eseguita.
Tuttavia, ci sono molti casi in cui vorresti che le proprietà JSON serializzate avessero nomi diversi, come la standardizzazione delle convenzioni di denominazione per altri servizi (usando casi come snake_case
, Invece di CamelCase
) o nomi di proprietà in conflitto (a Customer
può avere un firstName
, proprio come un Agent
– e un rapporto può contenerli entrambi firstName
proprietà e deve essere serializzato).
Creiamo un Book
classe, con pochi semplici campi:
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;
}
}
Modifica i nomi dei campi JSON con Jackson
Quando di solito si converte un'istanza di a Book
in JSON, scriveremmo il valore dell'oggetto come una stringa JSON utilizzando ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Questo risulta in:
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
I title
, author
ed releaseYear
sono una mappatura 1 a 1 per il title
, author
ed releaseYear
campi del POJO. Per modificare il nome di una proprietà JSON e conservarla dopo la serializzazione, non è necessario modificare il tuo POJO! È sufficiente annotare il campo pertinente con @JsonProperty
e fornisci il nome 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;
}
}
Ora, quando istanziamo l'oggetto e lo convertiamo in JSON:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Il codice risulta in:
{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}
Modificare i nomi dei campi JSON nella conversione da JSON a POJO?
Vale la pena notare che il cambio di nome non è unilaterale. La stessa annotazione funziona in entrambi i modi e può collegare un JSON in ingresso con nomi diversi in un oggetto valido. Ad esempio, un JSON che rappresenta un libro con book_title
, non verrebbe mappato su title
proprietà del Book
class per impostazione predefinita, poiché non sono la stessa cosa.
Dal momento che abbiamo annotato title
as book_title
– la conversione funziona bene:
Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);
Questo risulta in:
Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}
Nota: Per costruire un oggetto da JSON, la tua classe deve avere anche un costruttore vuoto. Jackson prima istanzia l'oggetto vuoto, quindi popola i campi usando getter e setter.
Annota getter e setter con @JsonProperty
Vuoi codificare nomi diversi per la serializzazione e la deserializzazione? Ad esempio, puoi serializzare Book
in un JSON con bt
che denota il titolo del libro, ma consuma JSON con book_title
. Puoi personalizzare i getter e i setter di Book
classe con @JsonProperty
annotazioni:
@JsonProperty("bt")
public String getBt() {
return title;
}
@JsonProperty("book_title")
public void setTitle(String title) {
this.title = title;
}
In questo modo, una volta serializzato, il file getBt()
il metodo serializzerà il title
come bt
campo in JSON. Durante la lettura da JSON (deserializzazione), dovrai fornire a book_title
, che viene mappato su title
.
Dai un'occhiata alla nostra guida pratica e pratica per l'apprendimento di Git, con le migliori pratiche, gli standard accettati dal settore e il cheat sheet incluso. Smetti di cercare su Google i comandi Git e in realtà imparare esso!
Nota: Entrambi bt
ed book_title
sarà mappato al title
campo, ma questo non fa bt
ed book_title
intercambiabile. Jackson non sarà in grado di convertire tra di loro senza prima convertirsi a title
.
Ora puoi creare un'istanza di un libro, serializzarlo e deserializzare un'altra stringa in un libro con:
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);
Questo risulta in:
{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}
Conclusione
In questo breve tutorial, abbiamo dato un'occhiata a come Jackson associa i campi oggetto a JSON e come puoi modificare il nome dei campi prima della serializzazione. Abbiamo anche esplorato l'idea di utilizzare nomi JSON diversi per la serializzazione e la deserializzazione, utilizzando il file @JsonProperty
annotazione a livello di metodo, anziché a livello di campo.