جکسون یک کتابخانه بسیار متداول برای مدیریت JSON و سریالسازی/دستزدایی به طور کلی در پروژههای مبتنی بر جاوا و Spring Boot است.
جکسون نامهای دارایی را با نگاشت آنها همانطور که هستند به JSON کنترل میکند - بنابراین
propertyName
در یک POJO یک متناظر خواهد داشتpropertyName
در JSON این قرارداد هنگام تبدیل JSON به POJO نیز رعایت می شود و اگر نام ها مطابقت نداشته باشند، تبدیل نمی تواند انجام شود.
با این حال، موارد زیادی وجود دارد که میخواهید ویژگیهای JSON سریالشده نامهای متفاوتی داشته باشند، مانند استاندارد کردن قراردادهای نامگذاری برای سرویسهای دیگر (با استفاده از مواردی مانند snake_case
، بجای CamelCase
) یا نام های دارای متضاد (الف Customer
می تواند یک firstName
، فقط به عنوان یک Agent
- و یک گزارش ممکن است حاوی هر دو مورد آنها باشد firstName
خواص و نیاز به سریال).
بیایید یک را ایجاد کنیم Book
کلاس، با چند فیلد ساده:
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;
}
}
نام فیلدهای JSON را با جکسون تغییر دهید
معمولاً هنگام تبدیل یک نمونه از a Book
در JSON، مقدار شی را به عنوان یک رشته JSON با استفاده از آن می نویسیم ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
این نتیجه در:
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
La title
, author
و releaseYear
نقشه برداری 1 به 1 به title
, author
و releaseYear
زمینه های POJO. برای تغییر نام یک ویژگی JSON و حفظ آن پس از سریال سازی، نیازی به تغییر POJO خود نیست! کافی است فیلد مربوطه را با آن حاشیه نویسی کنید @JsonProperty
و نام 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;
}
}
حال، وقتی شی را نمونه سازی می کنیم و آن را به JSON تبدیل می کنیم:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
کد نتیجه می دهد:
{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}
تغییر نام فیلدهای JSON در تبدیل JSON به POJO؟
شایان ذکر است که تغییر نام یک طرفه نیست. حاشیه نویسی یکسان به هر دو صورت کار می کند و می تواند یک JSON ورودی با نام های مختلف را به یک شی معتبر متصل کند. به عنوان مثال، یک JSON نشان دهنده یک کتاب با book_title
، به نقشه برداری نمی شود title
خاصیت Book
کلاس به طور پیش فرض، زیرا آنها یکسان نیستند.
از آنجایی که ما حاشیه نویسی کرده ایم title
as book_title
- تبدیل به خوبی کار می کند:
Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);
این نتیجه در:
Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}
توجه داشته باشید: برای ساختن یک شی از JSON، کلاس شما باید یک سازنده خالی نیز داشته باشد. جکسون ابتدا شی خالی را نمونه سازی می کند و سپس با استفاده از گیرنده ها و تنظیم کننده ها فیلدها را پر می کند.
با JsonProperty@ Getters و Setter ها را حاشیه نویسی کنید
آیا می خواهید نام های مختلفی را برای سریال سازی و سریال زدایی رمزگذاری کنید؟ به عنوان مثال، شما می توانید سریال کنید Book
به یک JSON با bt
عنوان کتاب را نشان می دهد، اما JSON را با آن مصرف کنید book_title
. میتوانید گیرندهها و تنظیمکنندهها را سفارشی کنید Book
کلاس با @JsonProperty
حاشیه نویسی:
@JsonProperty("bt")
public String getBt() {
return title;
}
@JsonProperty("book_title")
public void setTitle(String title) {
this.title = title;
}
به این ترتیب، هنگامی که سریال، getBt()
متد را سریالی می کند title
به عنوان یک bt
فیلد در JSON هنگام خواندن از JSON (جذابسازی)، باید a book_title
، که به نقشه برداری می شود title
.
راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
توجه داشته باشید: هر دو bt
و book_title
به نقشه برداری خواهد شد title
درست است، اما این باعث نمی شود bt
و book_title
قابل تعویض جکسون نمیتواند بین آنها بدون تبدیل به تبدیل، تبدیل کند title
.
اکنون، میتوانید یک کتاب را نمونهسازی کنید، آن را سریالی کنید، و رشتهای دیگر را به یک کتاب تبدیل کنید:
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);
این نتیجه در:
{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}
نتیجه
در این آموزش کوتاه، نگاهی انداختهایم به اینکه چگونه جکسون فیلدهای شی را به JSON نگاشت میکند و چگونه میتوانید نام فیلدها را قبل از سریالسازی تغییر دهید. ما همچنین ایده استفاده از نامهای مختلف JSON را برای سریالسازی و سریالزدایی با استفاده از آن بررسی کردهایم @JsonProperty
حاشیه نویسی در سطح روش، به جای سطح میدان.