Módosítsa a JSON-mezőnevet a Jackson segítségével Java-ban

A Jackson egy nagyon elterjedt könyvtár a JSON kezelésére és általában a szerializálásra/deserializálásra Java és Spring Boot alapú projektekben.

Jackson úgy kezeli a tulajdonságneveket, hogy leképezi azokat a JSON-hoz – tehát propertyName egy POJO-ban lesz egy megfelelő propertyName JSON-ban. Ezt a konvenciót követik a JSON POJO-ra konvertálásakor is, és ha a nevek nem egyeznek, az átalakítás nem hajtható végre.

Számos esetben azonban azt szeretné, hogy a sorosított JSON-tulajdonságok eltérő nevekkel rendelkezzenek, például más szolgáltatások elnevezési konvencióinak szabványosítása esetén (például snake_case, ahelyett CamelCase) vagy ütköző tulajdonságnevek (a Customer lehet egy firstName, mint egy Agent – és egy jelentés mindkettőjüket tartalmazhatja firstName tulajdonságait, és szerializálni kell).

Hozzuk létre a Book osztály, néhány egyszerű mezővel:

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

Módosítsa a JSON-mezőneveket Jacksonnal

Amikor általában konvertál egy példányt a Book JSON-ba, az objektum értékét JSON-karakterláncként írjuk fel a használatával ObjectMapper:

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

Ennek eredményeként:

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

A title, author és a releaseYear egy 1-1 leképezés a title, author és a releaseYear a POJO mezői. Egy JSON-tulajdon nevének megváltoztatásához és a szerializálás utáni megőrzéséhez nem szükséges módosítani a POJO-t! Elég, ha a megfelelő mezőt megjegyzésekkel látja el @JsonProperty, és adja meg a JSON nevet:

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

Most, amikor az objektumot példányosítjuk, és JSON-ba konvertáljuk:

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

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

A kód eredménye:

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

Módosítja a JSON-mezőneveket a JSON-POJO-konverzióban?

Érdemes megjegyezni, hogy a névváltoztatás nem egyoldalú. Ugyanaz a megjegyzés mindkét irányban működik, és áthidalhat egy különböző nevű bejövő JSON-t egy érvényes objektummá. Például egy JSON, amely egy könyvet képvisel book_title, nem lenne leképezve a title tulajdonosa Book alapértelmezés szerint osztály, mivel nem ugyanazok.

Mióta megjegyeztük title as book_title - az átalakítás jól működik:

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

Ennek eredményeként:

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

Jegyzet: Egy objektum JSON-ból való létrehozásához az osztálynak egy üres konstruktorral is rendelkeznie kell. Jackson először példányosítja az üres objektumot, majd feltölti a mezőket a getterek és setterek segítségével.

Jelölje meg a Gettereket és a Settereket a @JsonProperty segítségével

Különböző neveket szeretne kódolni a szerializáláshoz és a deszerializáláshoz? Például sorozhat Book JSON-ba bt jelöli a könyv címét, de használja a JSON-t ezzel book_title. Testreszabhatja a gettereket és a beállítókat Book osztályban @JsonProperty jelöléseket:

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

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

Ily módon, amikor soros, a getBt() metódus szerializálja a title mint bt mező a JSON-ban. Ha JSON-ból olvas (deszerializálás), meg kell adnia a book_title, amely hozzá van rendelve title.

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!

Jegyzet: Mindkét bt és a book_title lesz leképezve a title mezőben, de ez nem teszi lehetővé bt és a book_title felcserélhető. Jackson nem tud majd konvertálni közöttük anélkül, hogy először konvertálna erre title.

Mostantól példányosíthat egy könyvet, sorba rendezheti, és egy másik karakterláncot deszerializálhat könyvvé a következőkkel:

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

Ennek eredményeként:

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

Következtetés

Ebben a rövid oktatóanyagban megnéztük, hogyan képezi le Jackson az objektummezőket JSON-ba, és hogyan módosíthatja a mezők nevét a sorosítás előtt. Megvizsgáltuk azt az ötletet is, hogy különböző JSON-neveket használjunk szerializáláshoz és deszerializáláshoz, a @JsonProperty metódusszintű annotáció, nem pedig mezőszinten.

Időbélyeg:

Még több Stackabus