JavaRush /בלוג Java /Random-HE /מבוא למסגרת ג'קסון
Mikhail Fufaev
רָמָה
Москва

מבוא למסגרת ג'קסון

פורסם בקבוצה
בליל אביב קר, סוף סוף הגעתי לרמה 33. כשפשפתי את ידי המתכנת, כבר התכוננתי לאמץ את כל התחום של הסדרת ה-JSON והסידריאליזציה, אבל לצערי לא הבנתי כלום. לא זכרתי את טקסט ההרצאה, אבל הבעיות נפתרו איכשהו באופן אינטואיטיבי. בהקשר זה, החלטתי להתעמק בטבע הפראי של מסגרת ג'קסון ולהבין מהו ה-JSON הזה.
מסגרת ג'קסון
אשתדל להציג את כל הידע שלי בצורה מעשית ותמציתית בפורמט של צ'יטים (גם לעצמי וגם לקוראים). מסע אל הערות ג'קסון. הדבר הראשון שאנו נתקלים בו בדרך ל-JSON הוא ההערה @JsonAutoDetect. במבט ראשון, זה סיכום קל, אבל לקח למחבר את הזמן הארוך ביותר להבין את זה. לתקציר יש 5 שיטות שאנו צריכים:
  • fieldVisibility () - מסדרת רק שדות עם משנה הגישה שצוין
  • getterVisibility()/setterVisibility() - מסדרת שדות שלגטר/מגדיר שלהם יש את משנה הגישה שצוין
  • isGetterVisibility() - יישום נפרד לגטרים בוליאניים
חשוב להבין שהשיטות פועלות באופן נפרד. הָהֵן. אם השדה תואם לפחות אחד מהפרמטרים שצוינו בהערה, הוא ייכלל ב-JSON. נסה לענות מה הקוד הזה יוציא אם ניצור מופע באמצעות בנאי חסר פרמטרים:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
        getterVisibility        = JsonAutoDetect.Visibility.PUBLIC_ONLY,
        setterVisibility        = JsonAutoDetect.Visibility.PUBLIC_ONLY,
        isGetterVisibility      = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
    public String name;
    private Map<String, String> properties;
    public Queue<String> queue;
    protected List<String> list;
    private int age;
    private int number;
    private boolean isHead;

    protected HeadClass(int age) {
        this.age = age;
    }

    public HeadClass() {}

    Map<String, String> getProperties() {
        return properties;
    }

    protected boolean isHead() {
        return isHead;
    }

    protected void setProperties(Map<String, String> properties) {
        this.properties = properties;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}
מה אם נסיר את isGetterVisibility? ארבע השיטות המפורטות הגדירו את תהליך ההסדרה. החמישי, בתורו, מסדיר את תהליך הדה-סריאליזציה:
  • creatorVisibility() היא השיטה הקשה ביותר להבנה. זה עובד עם בנאים ועם שיטות מפעל (שיטות שיוצרות אובייקט כאשר קוראים לו). בואו נסתכל על דוגמה:
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
    public String name;
    public int id;

    HeadClass(@JsonProperty(value = "name") String name, @JsonProperty(value = "id") int id) {
        this.name = name;
        this.id = id;
    }

    protected HeadClass(String name) {
        this.name = name;
        this.id = 123;
    }

    protected HeadClass(int id) {
        this.id = id;
        this.name = "Yes!";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public static void main(String[] args) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    String forDeserialize = "{\"name\":\"No!\",\"id\":123}";
    StringReader reader = new StringReader(forDeserialize);

    HeadClass headClass1 = (HeadClass) mapper.readValue(reader, HeadClass.class);
}
הערה חשובה על מנגנון הדה-סריאליזציה! כאשר אנו מנסים ליצור אובייקט מ-JSON, הבנאי של המחלקה הנדרשת ייחפש עם אותה סט פרמטרים כמו באובייקט JSON. בדוגמה למעלה, אובייקט ה-JSON שלנו מורכב משני פרמטרים: שם, מזהה. נחשו לאיזה קונסטרוקטור זה יקרא. וכן, אם נקמפל את הקוד הזה, הוא יזרוק שגיאה, למה? מכיוון שהגבלנו את הנראות של הבנאי (רק בנאים עם השינוי הציבורי המוגן גלויים). אם תסיר את creatorVisibility זה יעבוד. נשאלת השאלה. מה זה @JsonProperty בקונסטרוקטור? אני חושב שאדבר על זה בחלק הבא של המאמר. נ.ב רבותי, אני באמת רוצה לקבל לפחות תגובות על המאמר. מעניין אם הנושא הזה מבוקש והאם כדאי להמשיך, כי יש הרבה נושאים וכולם מאוד מעניינים. אני רוצה גם לשקול הערות כגון @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped וכו'. תודה :)
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION