Dalam istilah awam, Jackson adalah perpustakaan kelas Java yang digunakan untuk memproses data berformat JSON, dan kinerjanya sangat baik. Artikel ini akan memberikan contoh analisis penggunaan Jackson yang lebih detail. Dengan rincian sebagai berikut:
1. Pendahuluan
Jackson memiliki efisiensi serialisasi dan deserialisasi yang relatif tinggi. Menurut pengujian, apa pun bentuk konversinya, Jackson > Gson > Json-lib, dan kekuatan pemrosesan Jackson bahkan hampir 10 kali lebih tinggi daripada Json-lib, dan memang benar. sangat tinggi. Sebaliknya, Json-lib tampaknya telah berhenti memperbarui, dan versi terbaru juga didasarkan pada JDK15, sementara komunitas Jackson lebih aktif.
Di bawah ini, kami akan memperkenalkan secara singkat penggunaan Jackson beserta contohnya.
2. Gunakan
Jackson menyediakan banyak kelas dan metode, dan kelas yang paling umum digunakan dalam serialisasi dan deserialisasi adalah kelas ObjectMapper, yang mirip dengan JsonObject dan ArrayObject di Json-lib. Kelas ini menyediakan metode seperti readTree(), readValue(), writeValueAsString() untuk konversi. Alamat dokumentasi khusus untuk kelas ini adalah: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html.
Untuk menghindari deskripsi berulang, objectMapper yang disebutkan di bawah ini semuanya berasal dari ObjectMapper objectMapper = new ObjectMapper(). Penggunaannya akan diperkenalkan secara singkat di bawah ini dalam hal serialisasi dan deserialisasi.
1. Serialisasi
① Membuat serial kelas Java sendiri
Contoh tes
Daftar daftar=New ArrayList();list.add(1);list.add(2);list.add(3);
Menerapkan serialisasi:
String teststringlist=objectMapper.writeValueAsString(list);System.out.println(teststringlist);
Output hasil di konsol adalah:
[1,2,3]
kesimpulannya:
Jackson dapat dengan mudah mengimplementasikan serialisasi tipe umum.
②Serialisasi kelas khusus
Contoh tes:
siswa kelas publik {private int age=10;private String name="hhh"; public String[] list={"hao","haouhao","keyi"}; public Date time=new Date(); () { kembalikan usia; } public void setAge(int age) { this.age = age; } public String getName() { kembalikan nama; } public void setName(String nama) { this.name = nama; }}
Untuk membuat contoh lebih umum, kelas ini menyertakan tipe nilai int, tipe referensi String, String[], dan tipe tanggal Date.
Menerapkan serialisasi
mahasiswa st=siswa baru();String teststringstu=objectMapper.writeValueAsString(st);System.out.println(teststringstu);
Output hasil di konsol adalah:
{"list":["hao","haouhao","keyi"],"time":1375429228382,"name":"hhh","age":10}
kesimpulannya:
Melalui output terlihat bahwa string Json yang dikonversi sesuai dengan formatnya. Namun, representasi waktu agak di bawah standar. Modifikasi format waktu akan diperkenalkan di bawah.
③Definisi format waktu
Jackson memiliki format waktu defaultnya sendiri, yaitu berupa stempel waktu, dan efeknya seperti terlihat pada hasil di atas (misalnya: 1375429228382). Jika Anda ingin mengatur format ini tidak valid, lewati
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, salah)
Hal ini dapat diatur sehingga pembuatan waktu menggunakan apa yang disebut notasi yang sesuai dengan [ISO-8601 ], menghasilkan waktu yang serupa dengan format berikut: "1970-01-01T00:00:00.000+0000".
Tentu saja, Anda juga dapat menyesuaikan format waktu keluaran.
Penerapan format waktu khusus
Contohnya juga menggunakan kelas siswa yang diperkenalkan di atas.
mahasiswa st=siswa baru();java.text.DateFormat myFormat = java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");objectMapper.getSerializationConfig().setDateFormat(myFormat);String teststringstu= objectMapper.writeValueAsString(st);System.out.println(teststringstu);
Output kerugian di konsol adalah:
{"list":["hao","haouhao","keyi"],"time":"02-08-2013 03:48:20","name":"hhh","age":10}
kesimpulannya:
Terlihat format keluaran waktu sudah sesuai dengan yang kita inginkan. Metode menentukan format keluaran waktu di Jackson jauh lebih sederhana daripada menentukan format waktu di JSON-lib.
④ Metode serialisasi lainnya
Menerapkan serialisasi
Contoh yang digunakan masih kelas siswa sebelumnya.
mahasiswa st=siswa baru();JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);jsonGenerator.writeObject(st);
Output di konsol adalah:
{"list":["hao","haouhao","keyi"],"time":1375429228382,"name":"hhh","age":10}
kesimpulannya:
Cara ini juga bisa mendapatkan nilai dari cara diatas. Namun perhatikan fungsi ini dalam metode ini: createJsonGenerator(), yang memerlukan dua parameter, satu adalah parameter tipe OutputStream dan yang lainnya adalah parameter tipe JsonEncoding. Melalui dua parameter ini, kita dapat memahami bahwa metode ini tidak hanya dapat menulis Json langsung ke aliran jaringan, tetapi juga menulis Json ke aliran file atau aliran memori. Jadi lebih serbaguna.
2. Deserialisasi
①Deserialisasi satu kali
Metode ini terutama menggunakan metode <testJsonClass> readValue(String content, Class<testJsonClass> valueType) yang disediakan oleh ObjectMapper. Metode ini memerlukan input string Json dan Kelas terkait dari kelas yang perlu diisi, dan mengembalikan kelas yang diisi.
Parsing string Json ke dalam kelas khusus
Ketika string Json adalah:
String test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"
waktu.
Pertama tentukan kelas:
tes kelas publikJsonClass { public int objectID; Daftar publik geoPoints=New ArrayList();}
Kemudian gunakan cuplikan kode berikut untuk membatalkan serialisasi Json ke dalam kelas ini:
testJsonClass testClass= objectMapper.readValue(test1, testJsonClass.class);
menggunakan
Sistem.keluar.println(testClass.objectID);Sistem.keluar.println(testClass.geoPoints)
Nilai yang dapat Anda lihat keluarannya di konsol adalah:
357[{x=504604.59802246094, y=305569.9150390625}]
Deserialisasikan string Json ke dalam kelas sistem itu sendiri
String json = "{"error":0,"data":{"name":"ABC","age":20,"phone":{"home":"abc","mobile":"def"}," teman":[{"nama":"DEF","telepon" :{"home":"hij","mobile":"klm"}},{"name":"GHI","phone":{"home":"nop","mobile":"qrs"} }]},"lainnya":{"nama panggilan":[]}}".
Tentukan variabel menggunakan Peta milik sistem: Peta<String, Peta<String, Objek>>. Kemudian gunakan map = objectMapper.readValue(json, Map.class) untuk membatalkan serialisasi Json ke dalam variabel peta.
lulus
System.out.println(maps.get("error"));System.out.println((Objek)(maps.get("data").get("telepon")))
Anda bisa mendapatkan hasil berikut di konsol:
0{rumah=abc, seluler=def}
②Deserialisasi bertahap
Metode ini lebih fleksibel dan hanya dapat mengekstrak nilai informasi string Json yang diminati pengguna. Hal ini terutama diimplementasikan menggunakan readTree yang disediakan oleh ObjectMapper dan kelas JsonNode yang disediakan oleh Jackson.
Contoh tes
Rangkaian test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.915039 0625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
String Json ini relatif kompleks, termasuk bentuk array bersarang, dan bersifat universal.
Menerapkan deserialisasi
JsonNode node= objectMapper.readTree(test); //Baca string Json ke dalam memori dalam struktur pohon JsonNode content=node.get("results");//Dapatkan informasi di bawah node hasil for(int i=0 ; saya<isi.ukuran();i++) //Melintasi informasi di bawah hasil, fungsi size() bisa mendapatkan jumlah informasi yang terkandung dalam node, serupa dengan panjang array {System.out.println(contents.get(i).get("objectID" ). getIntValue()); //Baca nilai node anak di bawah node JsonNode geoNumber=contents.get(i).get("geoPoints");for(int j=0;j<geoNumber.size();j++) //Ulangi informasi di bawah node anak {System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" " +geoNumber.get(j).get("y").getDoubleValue());}}
Output di konsol adalah:
357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625
kesimpulannya:
Cara ini mirip dengan parsing DOM pada parsing XML. Kelebihannya adalah strukturnya detail sehingga memudahkan dalam mengekstraksi informasi yang diinginkan. Tentu saja kekurangannya sama dengan cara ini: membutuhkan waktu dan tempat.
3. Ringkasan
Operasi Jackson pada Json terutama seperti yang ditunjukkan di atas. Metodenya sangat nyaman digunakan dan sangat fleksibel. Metode ini menyediakan operasi satu kali dan operasi yang dapat membaca informasi sesuai permintaan. Dan Jackson memiliki berbagai fungsi, yang dapat mengontrol serialisasi dan deserialisasi dalam berbagai detail, seperti fungsi anotasi, fungsi injeksi tertunda untuk Hibernate, dan fungsi pengaturan format waktu untuk nanti. Pada saat yang sama, Jackson juga mendukung serangkaian operasi serialisasi dan deserialisasi pada XML.
Mengenai kekurangan Jackson saat ini, beberapa orang di Internet telah menguji bahwa ini memakan lebih banyak memori daripada Json-lib. Menggunakan ruang untuk waktu umumnya bermanfaat.