Schimbați numele câmpului JSON cu Jackson în Java

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.

Timestamp-ul:

Mai mult de la Stackabuse