قم بتغيير اسم حقل JSON باستخدام Jackson في Java

جاكسون مكتبة شائعة جدًا للتعامل مع JSON والتسلسل / إلغاء التسلسل بشكل عام في مشاريع Java و 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 مع جاكسون

عند تحويل مثيل ملف 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}

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 class افتراضيًا ، لأنهم ليسوا متماثلين.

منذ أن شرحنا 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 ، يجب أن يكون للفصل الخاص بك مُنشئ فارغ أيضًا. يقوم جاكسون أولاً بإنشاء مثيل للكائن الفارغ ، ثم يملأ الحقول باستخدام أدوات التسجيل والضوابط.

علق Getters و Setters باستخدامJsonProperty

هل تريد ترميز أسماء مختلفة للتسلسل وإلغاء التسلسل؟ على سبيل المثال ، يمكنك إجراء تسلسل 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 (إلغاء التسلسل) ، ستحتاج إلى توفير ملف book_title، يتم تعيينه إلى title.

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling 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 التعليق التوضيحي على مستوى الطريقة ، بدلاً من المستوى الميداني.

الطابع الزمني:

اكثر من ستاكابوز