JavaRush /Java блогы /Random-KK /Джексон негізіне кіріспе
Mikhail Fufaev
Деңгей
Москва

Джексон негізіне кіріспе

Топта жарияланған
Көктемнің суық түнінде мен 33 деңгейге жеттім. Бағдарламалаушы қолдарымды ысқылай отырып, мен JSON сериализациясы мен сериядан шығарудың бүкіл өрісін қабылдауға дайындалып жатыр едім, бірақ, өкінішке орай, мен ештеңе түсінбедім. Дәрістің мәтіні есімде жоқ, бірақ мәселелер қандай да бір түрде интуитивті түрде шешілді. Осыған байланысты мен Джексон Фреймворктің жабайы мүмкіндіктерін зерттеп, бұл JSON не екенін анықтауды шештім.
Джексон Framework
Мен өзімнің барлық білімімді практикалық және қысқаша түрде хит парақ форматында ұсынуға тырысамын (өзім үшін де, оқырмандар үшін де). Джексонға саяхат annotationлары. JSON жолында кездесетін бірінші нәрсе - @JsonAutoDetect annotationсы. Бір қарағанда, бұл оңай түйіндеме, бірақ оны анықтау үшін авторға ең көп уақыт қажет болды. Аннотацияда бізге қажет 5 әдіс бар:
  • fieldVisibility () - Көрсетілген қатынас модификаторы бар өрістерді ғана сериялайды
  • getterVisibility()/setterVisibility() – гетер/қондырғышында рұқсат модификаторы көрсетілген өрістерді сериялайды
  • isGetterVisibility() – логикалық алушылар үшін бөлек іске асыру
Әдістердің өзара әрекеттесетінін түсіну маңызды. Анау. егер өріс 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() – түсінудің ең қиын әдісі. Ол конструкторлармен және зауыттық әдістермен (шақырылған кезде нысанды жасайтын әдістер) жұмыс істейді. Мысал қарастырайық:
@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 нысаны екі параметрден тұрады: атау, идентификатор. Қай конструкторды шақыратынын болжаңыз. Иә, егер біз осы codeты құрастырсақ, ол қате жібереді, неге? Өйткені біз конструктордың көрінуін шектедік (тек қорғалған, жалпы модификаторы бар конструкторлар көрінеді). CreatorVisibility қолданбасын жойсаңыз, ол жұмыс істейді. деген сұрақ туындайды. Конструктордағы @JsonProperty дегеніміз не? Мен бұл туралы мақаланың келесі бөлімінде айтатын боламын деп ойлаймын. PS мырзалар, мен мақала туралы кем дегенде жауап алғым келеді. Бұл тақырып сұранысқа ие ме және оны жалғастыру керек пе деп ойлаймын, өйткені тақырыптар өте көп және олардың барлығы өте қызықты. Сондай-ақ @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped және т.б. сияқты annotationларды қарастырғым келеді. Рақмет сізге :)
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION