Көктемнің суық түнінде мен 33 деңгейге жеттім. Бағдарламалаушы қолдарымды ысқылай отырып, мен JSON сериализациясы мен сериядан шығарудың бүкіл өрісін қабылдауға дайындалып жатыр едім, бірақ, өкінішке орай, мен ештеңе түсінбедім. Дәрістің мәтіні есімде жоқ, бірақ мәселелер қандай да бір түрде интуитивті түрде шешілді. Осыған байланысты мен Джексон Фреймворктің жабайы мүмкіндіктерін зерттеп, бұл JSON не екенін анықтауды шештім.
Мен өзімнің барлық білімімді практикалық және қысқаша түрде хит парақ форматында ұсынуға тырысамын (өзім үшін де, оқырмандар үшін де). Джексонға саяхат annotationлары. JSON жолында кездесетін бірінші нәрсе - @JsonAutoDetect annotationсы. Бір қарағанда, бұл оңай түйіндеме, бірақ оны анықтау үшін авторға ең көп уақыт қажет болды. Аннотацияда бізге қажет 5 әдіс бар:
- fieldVisibility () - Көрсетілген қатынас модификаторы бар өрістерді ғана сериялайды
- getterVisibility()/setterVisibility() – гетер/қондырғышында рұқсат модификаторы көрсетілген өрістерді сериялайды
- isGetterVisibility() – логикалық алушылар үшін бөлек іске асыру
@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ларды қарастырғым келеді. Рақмет сізге :)
GO TO FULL VERSION