تغییر نام فیلد JSON با جکسون در جاوا

جکسون یک کتابخانه بسیار متداول برای مدیریت 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 حاشیه نویسی در سطح روش، به جای سطح میدان.

تمبر زمان:

بیشتر از Stackabuse