שנה את שם השדה של 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 עם ג'קסון

כאשר בדרך כלל ממירים מופע של 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 ביאור ברמת השיטה, ולא ברמת השדה.

בול זמן:

עוד מ Stackabuse