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.