Spremenite ime polja JSON z Jacksonom v Javi

Jackson je zelo pogosta knjižnica za obdelavo JSON in serializacijo/deserializacijo na splošno v projektih, ki temeljijo na Javi in ​​Spring Boot.

Jackson obravnava imena lastnosti tako, da jih preslika, kakršna so, v JSON – torej propertyName v POJO bo imel ustrezen propertyName v JSON. Ta konvencija se upošteva tudi pri pretvorbi JSON v POJO in če se imena ne ujemata, pretvorbe ni mogoče izvesti.

Vendar pa obstaja veliko primerov, v katerih bi želeli, da imajo serializirane lastnosti JSON različna imena, na primer standardizirana pravila poimenovanja za druge storitve (z uporabo primerov, kot je snake_case, namesto CamelCase) ali nasprotujoča si imena lastnosti (a Customer lahko imajo firstName, samo kot Agent – in poročilo lahko vsebuje oboje firstName lastnosti in ga je treba serializirati).

Ustvarimo Book razred z nekaj preprostimi polji:

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

Spremenite imena polj JSON z Jacksonom

Pri navadni pretvorbi primerka a Book v JSON, bi vrednost predmeta zapisali kot niz JSON z uporabo ObjectMapper:

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

Rezultat tega je:

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

O title, author in releaseYear so preslikava 1 proti 1 v title, author in releaseYear polja POJO. Če želite spremeniti ime lastnosti JSON in ga obdržati po serializaciji, ni treba spreminjati POJO! Dovolj je, da označite ustrezno polje z @JsonPropertyin vnesite ime 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;
    }
    
}

Zdaj, ko instanciramo objekt in ga pretvorimo v JSON:

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

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

Rezultat kode je:

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

Spremeniti imena polj JSON pri pretvorbi JSON v POJO?

Omeniti velja, da sprememba imena ni enostranska. Ista opomba deluje v obe smeri in lahko premosti dohodni JSON z različnimi imeni v veljaven objekt. Na primer, JSON, ki predstavlja knjigo z book_title, ne bi bilo preslikano v title lastnina Book razred privzeto, saj nista enaka.

Ker smo dodali opombe title as book_title – pretvorba deluje dobro:

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

Rezultat tega je:

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

Opomba: Če želite zgraditi objekt iz JSON, mora imeti vaš razred tudi prazen konstruktor. Jackson najprej instancira prazen predmet, nato pa zapolni polja s pomočjo pridobivalnikov in nastavljalcev.

Označite pridobivalnike in nastavitve z @JsonProperty

Ali želite kodirati različna imena za serializacijo in deserializacijo? Na primer, lahko serializirate Book v JSON z bt označujejo naslov knjige, vendar uporabljajo JSON z book_title. Prilagodite lahko pridobivalnike in nastavljalce Book razred z @JsonProperty opombe:

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

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

Na ta način, ko je serijski, getBt() metoda bo serializirala title kot bt polje v JSON. Pri branju iz JSON (deserializacija) boste morali posredovati a book_title, ki se preslika v title.

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!

Opomba: oba bt in book_title bodo preslikani v title polje, vendar to ne pomeni bt in book_title zamenljivi. Jackson ne bo mogel pretvarjati med njima, ne da bi se prej pretvoril v title.

Zdaj lahko ustvarite primerek knjige, jo serializirate in deserializirate drug niz v knjigo z:

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

Rezultat tega je:

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

zaključek

V tej kratki vadnici smo si ogledali, kako Jackson preslika polja predmetov v JSON in kako lahko spremenite ime polj pred serializacijo. Raziskali smo tudi zamisel o uporabi različnih imen JSON za serializacijo in deserializacijo z uporabo @JsonProperty opombo na ravni metode in ne na ravni polja.

Časovni žig:

Več od Stackabuse