جاكسون مكتبة شائعة جدًا للتعامل مع 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
التعليق التوضيحي على مستوى الطريقة ، بدلاً من المستوى الميداني.