Muuta JSON-kentän nimi Jacksonilla Javassa

Jackson on hyvin yleinen kirjasto JSONin ja serialisoinnin/deserialisoinnin käsittelyyn yleensä Java- ja Spring Boot -pohjaisissa projekteissa.

Jackson käsittelee kiinteistöjen nimet kartoittamalla ne sellaisina kuin ne ovat JSONiin – niin propertyName POJOssa on vastaava propertyName JSONissa. Tätä käytäntöä noudatetaan myös muunnettaessa JSON POJO:ksi, ja jos nimet eivät täsmää, muuntamista ei voida tehdä.

On kuitenkin monia tapauksia, joissa haluat sarjoitetuilla JSON-ominaisuuksilla olevan erilaiset nimet, kuten muiden palveluiden nimeämiskäytäntöjen standardointi (esim. snake_case, sen sijasta CamelCase) tai ristiriitaisia ​​ominaisuuksien nimiä (a Customer voi olla firstName, aivan kuin an Agent – ja raportti voi sisältää molemmat firstName ominaisuudet ja se on sarjoitettava).

Luomme Book luokka, muutamalla yksinkertaisella kentällä:

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;
    }
    
}

Muuta JSON-kenttien nimiä Jacksonin kanssa

Kun tavallisesti muunnetaan esiintymää a Book JSONiin, kirjoitamme objektin arvon JSON-merkkijonona käyttämällä ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
        
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

Tämä johtaa:

{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}

- title, author ja releaseYear ovat 1-1-kartoitus title, author ja releaseYear POJO:n kentät. Jos haluat muuttaa JSON-ominaisuuden nimeä ja säilyttää sen sarjoituksen jälkeen, sinun ei tarvitse muuttaa POJOasi! Riittää, kun merkitään asiaankuuluva kenttä @JsonPropertyja anna 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;
    }
    
}

Nyt kun instantoimme objektin ja muunnamme sen JSONiksi:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);

String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

Koodi johtaa:

{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}

Muutetaanko JSON-kenttien nimet JSON-POJO-muunnoksessa?

On syytä huomata, että nimenmuutos ei ole yksipuolinen. Sama merkintä toimii molempiin suuntiin ja voi yhdistää saapuvan JSONin eri nimillä kelvolliseen objektiin. Esimerkiksi JSON, joka edustaa kirjaa, jossa on book_title, ei ole kartoitettu title omaisuus Book oletuksena, koska ne eivät ole samoja.

Koska olemme huomauttaneet title as book_title – muunnos toimii hienosti:

Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);

Tämä johtaa:

Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}

Huomautus: Jotta voit rakentaa objektin JSONista, luokassasi on oltava myös tyhjä konstruktori. Jackson instantoi ensin tyhjän objektin ja täyttää sitten kentät gettereillä ja asettimilla.

Merkitse hakijat ja asettajat @JsonPropertyllä

Haluatko koodata eri nimiä serialisointia ja deserialisointia varten? Voit esimerkiksi sarjottaa Book JSON-tiedostoksi bt tarkoittaa kirjan nimeä, mutta käytä JSON:ia sen kanssa book_title. Voit mukauttaa sen saajia ja asettajia Book luokka kanssa @JsonProperty huomautukset:

@JsonProperty("bt")
public String getBt() {
    return title;
}

@JsonProperty("book_title")
public void setTitle(String title) {
    this.title = title;
}

Tällä tavalla, kun sarjoitetaan, getBt() menetelmä sarjoittaa title kuten bt kenttä JSONissa. Kun luet JSONista (deserializing), sinun on annettava a book_title, joka kartoitetaan title.

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

Huomautus: molemmat bt ja book_title kartoitetaan kohteeseen title kenttään, mutta tämä ei tee bt ja book_title vaihdettavissa. Jackson ei voi muuntaa niiden välillä muuntamatta ensin kieleksi title.

Nyt voit luoda kirjan, sarjoittaa sen ja tehdä toisen merkkijonon kirjaksi seuraavilla tavoilla:

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);

Tämä johtaa:

{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}

Yhteenveto

Tässä lyhyessä opetusohjelmassa olemme tarkastelleet, kuinka Jackson kartoittaa objektikentät JSON-muotoon ja kuinka voit muuttaa kenttien nimiä ennen sarjoittamista. Olemme myös tutkineet ajatusta käyttää erilaisia ​​JSON-nimiä sarjoitukseen ja deserialointiin käyttämällä @JsonProperty merkintä menetelmätasolla kenttätason sijaan.

Aikaleima:

Lisää aiheesta Stackabus