Muutke Javas Jacksoniga JSON-i välja nime

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 vastav propertyName 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 @JsonPropertyja 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.

Ajatempel:

Veel alates Stackabus