JavaRush /Java блогу /Random-KY /Джексон алкактарына киришүү
Mikhail Fufaev
Деңгээл
Москва

Джексон алкактарына киришүү

Группада жарыяланган
Жаздын суук түнүндө акыры 33-деңгээлге жеттим. Программист колдорумду ушалап жатып, мен JSON сериализациясынын жана сериялаштырылышынын бардык тармагын кучагына алганга даярданып жаткам, бирок, тилекке каршы, мен эч нерсени түшүнгөн жокмун. Мен лекциянын тексти эсимде жок, бирок көйгөйлөр кандайдыр бир интуитивдик түрдө чечилди. Ушуга байланыштуу, мен Джексон Frameworkтин жапайы жерлерин изилдеп, бул JSON деген эмне экенин билүүнү чечтим.
Джексон Framework
Мен өзүмдүн бардык бorмдеримди практикалык жана кыскача формада көрсөтүүгө аракет кылам (өзүм үчүн да, окурмандар үчүн да). Journey to Jackson Annotations. JSON жолунда жолуккан биринчи нерсе бул @JsonAutoDetect annotationсы. Бир караганда, бул оңой кыскача, бирок аны түшүнүү үчүн автор эң көп убакытты талап кылды. Аннотацияда бизге керек болгон 5 ыкма бар:
  • fieldVisibility () - Көрсөтүлгөн мүмкүндүк модфикатору бар талааларды гана сериялаштырат
  • getterVisibility()/setterVisibility() - алуучунун/жөндөөчүнүн белгиленген мүмкүндүк модфикаторуна ээ болгон талааларды сериялаштырат
  • isGetterVisibility() - логикалык алуучулар үчүн өзүнчө ишке ашыруу
Бул ыкмалар disjunctively иш экенин түшүнүү маанилүү. Ошол. эгер талаа annotationда көрсөтүлгөн параметрлердин жок дегенде бирине дал келсе, анда ал 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);
}
Сериялаштыруу механизми боюнча маанилүү эскертүү! JSON an objectисин түзүүгө аракет кылганыбызда, талап кылынган класстын конструктору JSON an objectиндегидей эле параметрлер топтому менен изделет. Жогорудагы мисалда биздин JSON an objectи эки параметрден турат: аты, id. Ал кайсы конструкторду чакырарын болжолдоп көрүңүз. Ооба, эгер биз бул codeду түзсөк, ал ката кетирет, эмне үчүн? Анткени биз конструктордун көрүнүшүн чектедик (корголгон, коомдук өзгөрткүчү бар конструкторлор гана көрүнөт). CreatorVisibility өчүрүлсө, ал иштейт. деген суроо туулат. Конструктордо @JsonProperty деген эмне? Мен бул тууралуу макаланын кийинки бөлүгүндө сүйлөшөм деп ойлойм. PS Мырзалар, мен чындап эле макала боюнча жок дегенде жооп алгым келет. Бул тема суроо-талапка ээби жана аны улантуу керекпи деп ойлойм, анткени темалар көп жана алардын баары абдан кызыктуу. Мен ошондой эле @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped ж.б. сыяктуу annotationларды эске алгым келет. Рахмат :)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION