API Streaming Jackson

1 . Gambaran keseluruhan

Dalam artikel ini, kita akan melihat Jackson Streaming API. Ia menyokong membaca dan menulis, dan dengan menggunakannya, kita dapat menulis penghurai JSON berprestasi tinggi dan pantas.

Sebaliknya, agak sukar untuk digunakan - setiap perincian data JSON perlu dikendalikan secara eksplisit dalam kod.

2. Ketergantungan Maven

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

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Menulis kepada JSON

Kita boleh menulis kandungan JSON terus ke OutputStream dengan menggunakan kelas JsonGenerator . Pertama, kita perlu membuat contoh objek itu:

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

Seterusnya, katakan bahawa kami ingin menulis JSON dengan struktur berikut:

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

Kita boleh menggunakan contoh JsonGenerator untuk menulis bidang tertentu terus 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 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. Menghuraikan JSON

Apabila kita mendapat JSON String sebagai input, dan kita ingin mengekstrak bidang tertentu daripadanya, 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 medan parsedName, parsedAge, dan alamat dari input JSON. Untuk mencapainya, kita perlu menangani logik penghuraian tahap rendah dan melaksanakannya 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 menetapkan ke bidang yang sesuai. Setelah menguraikan dokumen, semua bidang harus mempunyai data yang betul:

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

5. Mengekstrak Bahagian JSON

Kadang kala, ketika kita menguraikan dokumen JSON, kita hanya berminat dengan satu bidang tertentu.

Sebaik-baiknya, dalam situasi seperti ini, kita hanya ingin menguraikan permulaan dokumen, dan setelah bidang yang diperlukan dijumpai, kita dapat membatalkan pemprosesan.

Katakan bahawa kita hanya berminat dengan bidang umur input JSON. Dalam kes ini, kita dapat menerapkan logik penghuraian untuk berhenti mengurai apabila medan yang diperlukan dijumpai:

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 mempunyai nilai:

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

Berkat itu, penghuraian dokumen JSON akan menjadi jauh lebih cepat kerana kita tidak perlu membaca keseluruhan dokumen tetapi hanya sebahagian kecil daripadanya.

6. Kesimpulannya

Dalam artikel ringkas ini, kami melihat bagaimana kami dapat memanfaatkan Streaming Processing API dari Jackson.

Pelaksanaan semua contoh dan potongan kode ini boleh didapati di GitHub - ini adalah projek Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.