Modifica il nome del campo JSON con Jackson in Java

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 corrispondente propertyName 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 @JsonPropertye 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.

Timestamp:

Di più da Impilamento