JavaRush /مدونة جافا /Random-AR /مقدمة إلى إطار جاكسون
Mikhail Fufaev
مستوى
Москва

مقدمة إلى إطار جاكسون

نشرت في المجموعة
في ليلة ربيعية باردة، وصلت أخيرًا إلى المستوى 33. فرك يدي المبرمج، كنت أستعد بالفعل لاحتضان مجال تسلسل JSON وإلغاء التسلسل بأكمله، لكن لسوء الحظ، لم أفهم أي شيء. لم أتذكر نص المحاضرة، ولكن تم حل المشكلات بطريقة حدسية. في هذا الصدد، قررت الخوض في براري إطار جاكسون ومعرفة ما هو JSON هذا.
إطار جاكسون
سأحاول تقديم كل معرفتي بطريقة عملية وموجزة بتنسيق ورقة الغش (سواء لنفسي أو للقراء). رحلة إلى شروح جاكسون. أول شيء نواجهه في طريقنا إلى JSON هو التعليق التوضيحي @JsonAutoDetect. للوهلة الأولى، يبدو هذا ملخصًا سهلاً، لكن المؤلف استغرق وقتًا أطول لفهمه. يحتوي الملخص على 5 طرق نحتاجها:
  • fieldVisibility () - إجراء تسلسل للحقول ذات معدل الوصول المحدد فقط
  • getterVisibility()/setterVisibility() - إجراء تسلسل للحقول التي يحتوي getter/setter فيها على معدل الوصول المحدد
  • 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