ג'קסון היא ספרייה נפוצה מאוד לטיפול ב-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 עם ג'קסון
כאשר בדרך כלל ממירים מופע של 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}
אל האני 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 and 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, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות 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
ביאור ברמת השיטה, ולא ברמת השדה.