Jackson Streaming API

1 . Gambaran

Pada artikel ini, kita akan melihat Jackson Streaming API. Ini mendukung membaca dan menulis, dan dengan menggunakannya, kita dapat menulis parser JSON yang berkinerja tinggi dan cepat.

Di sisi lain, agak sulit untuk digunakan - setiap detail data JSON perlu ditangani secara eksplisit dalam kode.

2. Ketergantungan Maven

Pertama, kita perlu menambahkan dependensi Maven ke jackson-core :

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Menulis ke JSON

Kita bisa menulis konten JSON langsung ke OutputStream dengan menggunakan kelas JsonGenerator . Pertama, kita perlu membuat instance dari objek itu:

ByteArrayOutputStream stream = new ByteArrayOutputStream(); JsonFactory jfactory = new JsonFactory(); JsonGenerator jGenerator = jfactory .createGenerator(stream, JsonEncoding.UTF8);

Selanjutnya, katakanlah kita ingin menulis JSON dengan struktur berikut:

{ "name":"Tom", "age":25, "address":[ "Poland", "5th avenue" ] }

Kita dapat menggunakan sebuah instance dari JsonGenerator untuk menulis field tertentu langsung ke OutputStream:

jGenerator.writeStartObject(); jGenerator.writeStringField("name", "Tom"); jGenerator.writeNumberField("age", 25); jGenerator.writeFieldName("address"); jGenerator.writeStartArray(); jGenerator.writeString("Poland"); jGenerator.writeString("5th avenue"); jGenerator.writeEndArray(); jGenerator.writeEndObject(); jGenerator.close();

Untuk memeriksa apakah JSON yang tepat telah dibuat, kita dapat membuat objek String dengan objek JSON di dalamnya:

String json = new String(stream.toByteArray(), "UTF-8"); assertEquals( json, "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}");

4. Parsing JSON

Saat kami mendapatkan String JSON sebagai input, dan kami ingin mengekstrak bidang tertentu darinya, kelas JsonParser dapat digunakan:

String json = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}"; JsonFactory jfactory = new JsonFactory(); JsonParser jParser = jfactory.createParser(json); String parsedName = null; Integer parsedAge = null; List addresses = new LinkedList();

Kami ingin mendapatkan bidang parsedName, parsedAge, dan alamat dari input JSON. Untuk mencapai ini, kita perlu menangani logika parsing tingkat rendah dan menerapkannya sendiri:

while (jParser.nextToken() != JsonToken.END_OBJECT) { String fieldname = jParser.getCurrentName(); if ("name".equals(fieldname)) { jParser.nextToken(); parsedName = jParser.getText(); } if ("age".equals(fieldname)) { jParser.nextToken(); parsedAge = jParser.getIntValue(); } if ("address".equals(fieldname)) { jParser.nextToken(); while (jParser.nextToken() != JsonToken.END_ARRAY) { addresses.add(jParser.getText()); } } } jParser.close();

Bergantung pada nama bidang, kami mengekstraknya dan menetapkannya ke bidang yang sesuai. Setelah mengurai dokumen, semua bidang harus memiliki data yang benar:

assertEquals(parsedName, "Tom"); assertEquals(parsedAge, (Integer) 25); assertEquals(addresses, Arrays.asList("Poland", "5th avenue"));

5. Mengekstrak Bagian JSON

Terkadang, saat kami mengurai dokumen JSON, kami hanya tertarik pada satu bidang tertentu.

Idealnya, dalam situasi ini, kami hanya ingin mengurai awal dokumen, dan setelah bidang yang diperlukan ditemukan, kami dapat membatalkan pemrosesan.

Katakanlah kita hanya tertarik pada bidang usia input JSON. Dalam kasus ini, kita dapat mengimplementasikan logika parsing untuk menghentikan penguraian setelah bidang yang diperlukan ditemukan:

while (jParser.nextToken() != JsonToken.END_OBJECT) { String fieldname = jParser.getCurrentName(); if ("age".equals(fieldname)) { jParser.nextToken(); parsedAge = jParser.getIntValue(); return; } } jParser.close();

Setelah diproses, satu-satunya bidang parsedAge akan memiliki nilai:

assertNull(parsedName); assertEquals(parsedAge, (Integer) 25); assertTrue(addresses.isEmpty());

Berkat itu, penguraian dokumen JSON akan jauh lebih cepat karena kita tidak perlu membaca seluruh dokumen tetapi hanya sebagian kecil saja.

6. Kesimpulan

Dalam artikel singkat ini, kami melihat bagaimana kami dapat memanfaatkan API Pemrosesan Streaming dari Jackson.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di GitHub - ini adalah proyek Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.