JavaRush /Java blogi /Random-UZ /Jekson Frameworkga kirish
Mikhail Fufaev
Daraja
Москва

Jekson Frameworkga kirish

Guruhda nashr etilgan
Bahorning sovuq kechasida men nihoyat 33 darajaga yetdim. Dasturchi qo'llarimni ishqalab, men JSON seriyali va seriyalilashtirishning butun sohasini qamrab olishga tayyorlanayotgan edim, lekin, afsuski, men hech narsani tushunmadim. Men ma'ruza matnini eslay olmadim, lekin muammolar qandaydir tarzda intuitiv ravishda hal qilindi. Shu munosabat bilan men Jekson Framework-ning yovvoyi tabiatini o'rganishga va bu JSON nima ekanligini aniqlashga qaror qildim.
Jekson Framework
Men barcha bilimlarimni amaliy va ixcham tarzda cheat varaq formatida taqdim etishga harakat qilaman (ham o'zim uchun, ham o'quvchilar uchun). Jeksonga sayohat izohlari. JSONga boradigan yo'lda biz duch keladigan birinchi narsa bu @JsonAutoDetect izohidir. Bir qarashda, bu oson xulosa, lekin muallif buni tushunish uchun eng uzoq vaqt talab qildi. Abstraktda bizga kerak bo'lgan 5 ta usul mavjud:
  • fieldVisibility () - faqat belgilangan kirish modifikatoriga ega maydonlarni ketma-ketlashtiradi
  • getterVisibility()/setterVisibility() - qabul qiluvchi/setter belgilangan kirish modifikatoriga ega bo'lgan maydonlarni ketma-ketlashtiradi
  • isGetterVisibility() - mantiqiy qabul qiluvchilar uchun alohida dastur
Usullar bir-biridan ajralib turishini tushunish muhimdir. Bular. agar maydon izohda ko'rsatilgan parametrlardan kamida bittasiga to'g'ri kelsa, u JSONga kiritiladi. Agar parametrsiz konstruktor yordamida misol yaratsak, bu kod nima chiqishiga javob berishga harakat qiling:
@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;
    }
}
Agar isGtterVisibility ni olib tashlasak nima bo'ladi? Ro'yxatda keltirilgan to'rtta usul ketma-ketlashtirish jarayonini sozladi. Beshinchisi, o'z navbatida, seriyadan chiqarish jarayonini tartibga soladi:
  • creatorVisibility() tushunish uchun eng qiyin usul. U konstruktorlar va zavod usullari (chaqirilganda ob'ektni yaratuvchi usullar) bilan ishlaydi. Keling, bir misolni ko'rib chiqaylik:
@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);
}
Seriyadan chiqarish mexanizmi haqida muhim eslatma! JSON-dan ob'ekt yaratishga harakat qilganimizda, kerakli sinf konstruktori JSON ob'ektidagi kabi bir xil parametrlar to'plami bilan qidiriladi. Yuqoridagi misolda bizning JSON obyektimiz ikkita parametrdan iborat: nom, id. Qaysi konstruktorni chaqirishini taxmin qiling. Ha, agar biz ushbu kodni tuzsak, u xatoga yo'l qo'yadi, nega? Chunki biz konstruktorning koʻrinishini cheklab qoʻydik (faqat himoyalangan, ommaviy modifikatorga ega konstruktorlar koʻrinadi). Agar siz creatorVisibility-ni olib tashlasangiz, u ishlaydi. degan savol tug'iladi. Konstruktorda @JsonProperty nima? O'ylaymanki, bu haqda maqolaning keyingi qismida gaplashaman. PS Janoblar, men maqola haqida hech bo'lmaganda javob olishni xohlayman. Qiziq, bu mavzu talabga egami va davom ettirishga arziydimi, chunki mavzular juda ko'p va ularning barchasi juda qiziq. Men @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped va boshqalar kabi izohlarni ham ko'rib chiqmoqchiman. Rahmat :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION