JavaRush /Blog Java /Random-MS /Pengenalan kepada Rangka Kerja Jackson
Mikhail Fufaev
Tahap
Москва

Pengenalan kepada Rangka Kerja Jackson

Diterbitkan dalam kumpulan
Pada malam musim bunga yang sejuk, saya akhirnya mencapai tahap 33. Sambil menggosok tangan pengaturcara saya, saya sudah bersedia untuk merangkul seluruh bidang pensirilan dan penyahserilangan JSON, tetapi, malangnya, saya tidak memahami apa-apa. Saya tidak ingat teks kuliah, tetapi masalahnya diselesaikan secara intuitif. Dalam hal ini, saya memutuskan untuk menyelidiki keajaiban Rangka Kerja Jackson dan mengetahui apakah JSON ini.
Rangka Kerja Jackson
Saya akan cuba membentangkan semua pengetahuan saya secara praktikal dan ringkas dalam format helaian tipu (untuk diri saya sendiri dan untuk pembaca). Perjalanan ke Anotasi Jackson. Perkara pertama yang kami temui dalam perjalanan ke JSON ialah anotasi @JsonAutoDetect. Pada pandangan pertama, ini adalah ringkasan yang mudah, tetapi penulis mengambil masa yang paling lama untuk memikirkannya. Abstrak mempunyai 5 kaedah yang kita perlukan:
  • fieldVisibility () - Mensiri hanya medan dengan pengubah suai akses yang ditentukan
  • getterVisibility()/setterVisibility() - menyerikan medan yang getter/setternya mempunyai pengubah suai akses yang ditentukan
  • isGetterVisibility() - pelaksanaan berasingan untuk getter boolean
Adalah penting untuk memahami bahawa kaedah berfungsi secara disjungtif. Itu. jika medan sepadan dengan sekurang-kurangnya satu daripada parameter yang dinyatakan dalam anotasi, maka medan tersebut akan disertakan dalam JSON. Cuba jawab apa yang akan dikeluarkan oleh kod ini jika kita membuat contoh menggunakan pembina 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 mengalih keluar isGetterVisibility? Empat kaedah yang disenaraikan mengkonfigurasi proses bersiri. Yang kelima, seterusnya, mengawal proses penyahserikatan:
  • creatorVisibility() ialah kaedah yang paling sukar untuk difahami. Ia berfungsi dengan pembina dan dengan kaedah kilang (kaedah yang mencipta objek apabila dipanggil). Mari lihat 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);
}
Nota penting mengenai mekanisme penyahserikatan! Apabila kita cuba mencipta objek daripada JSON, pembina kelas yang diperlukan akan dicari dengan set parameter yang sama seperti dalam objek JSON. Dalam contoh di atas, objek JSON kami terdiri daripada dua parameter: nama, id. Teka pembina mana yang akan dipanggil. Dan ya, jika kita menyusun kod ini, ia akan menimbulkan ralat, mengapa? Kerana kami telah mengehadkan keterlihatan pembina (hanya pembina yang dilindungi, pengubah suai awam boleh dilihat). Jika anda mengalih keluar creatorVisibility ia akan berfungsi. Timbul persoalan. Apakah @JsonProperty dalam pembina? Saya fikir saya akan bercakap tentang ini dalam bahagian seterusnya artikel. PS Tuan-tuan, saya benar-benar ingin mendapat sekurang-kurangnya maklum balas mengenai artikel tersebut. Saya tertanya-tanya sama ada topik ini dalam permintaan dan sama ada ia berbaloi untuk diteruskan, kerana terdapat banyak topik dan semuanya sangat menarik. Saya juga ingin mempertimbangkan anotasi seperti @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped, dll. Terima kasih :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION