JavaRush /Блоги Java /Random-TG /Муқаддима ба чаҳорчӯбаи Ҷексон
Mikhail Fufaev
Сатҳи
Москва

Муқаддима ба чаҳорчӯбаи Ҷексон

Дар гурӯҳ нашр шудааст
Дар шаби сарди баҳор ман ниҳоят ба сатҳи 33 расидам. Дастони барномасози худро молиш дода, ман аллакай омодагӣ медидам, ки тамоми майдони сериализатсия ва сериализатсияи JSON-ро қабул кунам, аммо, мутаассифона, ман чизе нафаҳмидам. Ман матни лексияро дар хотир надорам, аммо мушкилот ба таври интуитивӣ ҳал карда шуданд. Дар робита ба ин, ман қарор додам, ки ба ваҳшӣ аз чаҳорчӯбаи Ҷексон омӯзам ва бифаҳмам, ки ин JSON чист.
Чаҳорчӯби Ҷексон
Ман кӯшиш мекунам, ки тамоми донишҳои худро ба таври амалӣ ва мухтасар дар формати варақаи фиреб пешниҳод кунам (ҳам барои худам ва ҳам барои хонандагон). Сафар ба Ҷексон шарҳҳо. Аввалин чизе, ки мо дар роҳ ба JSON дучор мешавем, шарҳи @JsonAutoDetect мебошад. Дар назари аввал, ин як хулосаи осон аст, аммо барои фаҳмидани он муаллиф муддати тӯлонитаринро сарф кард. Реферат 5 усул дорад, ки ба мо лозим аст:
  • fieldVisibility () - Танҳо майдонҳоро бо тағирдиҳандаи дастрасии муайяншуда силсилавӣ мекунад
  • getterVisibility()/setterVisibility() - майдонҳоеро сериал мекунад, ки қабулкунанда/танзимкунандаи онҳо тағирдиҳандаи дастрасии мушаххас дорад
  • isGetterVisibility () - татбиқи алоҳида барои қабулкунандагони булӣ
Фаҳмидани он муҳим аст, ки усулҳо ба таври ҷудогона кор мекунанд. Онхое. агар майдон ҳадди аққал ба яке аз параметрҳои дар эзоҳ нишондодашуда мувофиқат кунад, он ба JSON дохил карда мешавад. Кӯшиш кунед, ки ҷавоб диҳед, ки ин code чӣ натиҷа медиҳад, агар мо бо истифода аз конструктори бепараметр мисол эҷод кунем:
@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;
    }
}
Чӣ мешавад, агар мо isGtterVisibility -ро хориҷ кунем? Чор усули номбаршуда раванди сериализатсияро танзим карданд. Панҷум, дар навбати худ, раванди бесериализатсияро танзим мекунад:
  • creatorVisibility() мушкилтарин усули фаҳмидани он аст. Он бо конструкторҳо ва усулҳои заводӣ кор мекунад (усулҳое, ки ҳангоми даъват an object эҷод мекунанд). Биёед як мисолро дида бароем:
@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);
}
Қайдҳои муҳим дар бораи механизми бесериализатсия! Вақте ки мо кӯшиш мекунем, ки an objectро аз JSON эҷод кунем, конструктори синфи зарурӣ бо ҳамон маҷмӯи параметрҳо, ки дар an objectи JSON аст, ҷустуҷӯ карда мешавад. Дар мисоли боло an objectи JSON-и мо аз ду параметр иборат аст: ном, id. Фикр кунед, ки кадом конструкторро даъват мекунад. Ва ҳа, агар мо ин codeро тартиб диҳем, он хатогӣ медиҳад, чаро? Азбаски мо намуди зоҳирии созандаро маҳдуд кардем (танҳо конструкторҳо бо тағирдиҳандаи муҳофизатшуда ва ҷамъиятӣ намоёнанд). Агар шумо creatorVisibility -ро хориҷ кунед, он кор хоҳад кард. Саволе ба миён меояд. @JsonProperty дар созанда чист? Ман фикр мекунам, ки ман дар ин бора дар қисми ояндаи мақола сӯҳбат хоҳам кард. PS Ҷанобон, ман дар ҳақиқат мехоҳам ҳадди аққал дар бораи мақола посух гирам. Ман ҳайронам, ки оё ин мавзӯъ талабот аст ва оё меарзад идома додан, зеро мавзӯъҳо зиёданд ва ҳамаашон хеле ҷолибанд. Ман инчунин мехоҳам шарҳҳоро ба монанди @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped ва ғайра баррасӣ кунам. Сипос :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION