JavaRush /Java Blog /Random-ID /Pengantar Kerangka Jackson
Mikhail Fufaev
Level 35
Москва

Pengantar Kerangka Jackson

Dipublikasikan di grup Random-ID
Pada malam musim semi yang dingin, saya akhirnya mencapai level 33. Sambil menggosok tangan programmer saya, saya sudah bersiap untuk merangkul seluruh bidang serialisasi dan deserialisasi JSON, tetapi sayangnya saya tidak mengerti apa-apa. Saya tidak ingat teks ceramahnya, tetapi masalahnya diselesaikan secara intuitif. Dalam hal ini, saya memutuskan untuk mempelajari belantara Jackson Framework dan mencari tahu apa itu JSON.
Kerangka Jackson
Semua pengetahuan saya akan saya coba sajikan secara praktis dan ringkas dalam format contekan (baik untuk saya sendiri maupun untuk pembaca). Anotasi Perjalanan ke Jackson. Hal pertama yang kita temui dalam perjalanan ke JSON adalah anotasi @JsonAutoDetect. Sekilas, ini adalah ringkasan yang mudah, tetapi penulis membutuhkan waktu paling lama untuk memahaminya. Abstrak memiliki 5 metode yang kita butuhkan:
  • fieldVisibility () - Hanya membuat serial bidang dengan pengubah akses yang ditentukan
  • getterVisibility()/setterVisibility() - membuat serial bidang yang pengambil/penyetelnya memiliki pengubah akses yang ditentukan
  • isGetterVisibility() - implementasi terpisah untuk pengambil boolean
Penting untuk dipahami bahwa metode ini bekerja secara terpisah. Itu. jika bidang tersebut cocok dengan setidaknya salah satu parameter yang ditentukan dalam anotasi, maka bidang tersebut akan disertakan dalam JSON. Coba jawab apa yang akan dihasilkan kode ini jika kita membuat sebuah instance menggunakan konstruktor tanpa parameter:
@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;
    }
}
Bagaimana jika kita menghapus isGetterVisibility? Empat metode yang tercantum mengonfigurasi proses serialisasi. Yang kelima, pada gilirannya, mengatur proses deserialisasi:
  • penciptaVisibility() adalah metode yang paling sulit untuk dipahami. Ia bekerja dengan konstruktor dan metode pabrik (metode yang membuat objek saat dipanggil). Mari kita lihat sebuah contoh:
@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);
}
Catatan penting tentang mekanisme deserialisasi! Saat kita mencoba membuat objek dari JSON, konstruktor kelas yang diperlukan akan dicari dengan kumpulan parameter yang sama seperti pada objek JSON. Pada contoh di atas, objek JSON kita terdiri dari dua parameter: nama, id. Tebak konstruktor mana yang akan dipanggil. Dan ya, jika kita mengkompilasi kode ini, maka akan terjadi kesalahan, mengapa? Karena kami telah membatasi visibilitas konstruktor (hanya konstruktor dengan pengubah publik yang dilindungi yang terlihat). Jika Anda menghapus CreatorVisibility, itu akan berhasil. Pertanyaan muncul. Apa @JsonProperty di konstruktor? Saya rasa saya akan membicarakan hal ini di bagian artikel selanjutnya. PS Tuan-tuan, Saya sangat ingin mendapat setidaknya tanggapan tentang artikel tersebut. Saya ingin tahu apakah topik ini diminati dan layak dilanjutkan, karena topiknya banyak sekali dan semuanya sangat menarik. Saya juga ingin mempertimbangkan anotasi seperti @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped, dll. Terima kasih :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION