JavaRush /Java Blogu /Random-AZ /Cekson Çərçivəsinə giriş
Mikhail Fufaev
Səviyyə
Москва

Cekson Çərçivəsinə giriş

Qrupda dərc edilmişdir
Soyuq bir yaz gecəsində nəhayət 33-cü səviyyəyə çatdım. Proqramçı əllərimi ovuşduraraq, mən artıq JSON serializasiyası və serializasiyasının bütün sahəsini əhatə etməyə hazırlaşırdım, lakin təəssüf ki, heç nə başa düşmədim. Mühazirə mətnini xatırlamadım, amma problemlər birtəhər intuitiv şəkildə həll edildi. Bununla əlaqədar olaraq, mən Jackson Framework-in vəhşi sahələrini araşdırmağa və bu JSON-un nə olduğunu anlamağa qərar verdim.
Jackson Framework
Bütün biliklərimi fırıldaqçı vərəq formatında (həm özüm, həm də oxucular üçün) praktiki və qısa şəkildə təqdim etməyə çalışacağam. Ceksona Səyahət Annotasiyaları. JSON-a gedən yolda qarşılaşdığımız ilk şey @JsonAutoDetect annotasiyasıdır. İlk baxışdan bu, asan xülasədir, lakin bunu başa düşmək müəllifə ən çox vaxt aparıb. Abstraktda bizə lazım olan 5 üsul var:
  • fieldVisibility () - Yalnız müəyyən giriş dəyişdiricisi olan sahələri seriyalaşdırır
  • getterVisibility()/setterVisibility() - alıcı/setter müəyyən giriş dəyişdiricisi olan sahələri seriallaşdırır
  • isGetterVisibility() - boolean alıcılar üçün ayrıca icra
Metodların ayrı-ayrılıqda işlədiyini başa düşmək vacibdir. Bunlar. sahə annotasiyada göstərilən parametrlərdən ən azı birinə uyğun gəlirsə, o zaman JSON-a daxil ediləcək. Parametrsiz konstruktordan istifadə edərək nümunə yaratsaq, bu kodun nə çıxaracağına cavab verməyə çalışın:
@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-i silsək nə olacaq? Siyahıda göstərilən dörd üsul seriallaşdırma prosesini konfiqurasiya etdi. Beşincisi, öz növbəsində, sıradan çıxarma prosesini tənzimləyir:
  • creatorVisibility() başa düşmək üçün ən çətin üsuldur. O, konstruktorlarla və zavod metodları ilə (çağırılan zaman obyekt yaradan üsullar) işləyir. Bir misala baxaq:
@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 çıxarma mexanizminə dair vacib qeyd! JSON-dan obyekt yaratmağa çalışdığımız zaman tələb olunan sinfin konstruktoru JSON obyektində olduğu kimi eyni parametrlər dəsti ilə axtarılacaq. Yuxarıdakı nümunədə JSON obyektimiz iki parametrdən ibarətdir: ad, id. Hansı konstruktoru çağıracağını təxmin edin. Və bəli, bu kodu tərtib etsək, səhv salacaq, niyə? Çünki biz konstruktorun görünməsini məhdudlaşdırdıq (yalnız qorunan, ictimai dəyişdiricisi olan konstruktorlar görünür). CreatorVisibility proqramını silsəniz, o işləyəcək. sual yaranır. Konstruktorda @JsonProperty nədir? Düşünürəm ki, məqalənin növbəti hissəsində bu barədə danışacağam. P.S. Cənablar, mən çox istərdim ki, məqalə ilə bağlı bir az da olsa cavab alasınız. Maraqlıdır, bu mövzuya tələbat varmı və davam etdirməyə dəyərmi, çünki mövzular çoxdur və hamısı çox maraqlıdır. @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped və s. kimi annotasiyaları da nəzərə almaq istərdim. Çox sağ ol :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION