Jackson Streaming-API

1. Overzicht

In dit artikel zullen we kijken naar de Jackson Streaming API. Het ondersteunt zowel lezen als schrijven, en door het te gebruiken, kunnen we krachtige en snelle JSON-parsers schrijven.

Aan de andere kant is het een beetje moeilijk te gebruiken - elk detail van JSON-gegevens moet expliciet in code worden verwerkt.

2. Maven Afhankelijkheid

Ten eerste moeten we een Maven-afhankelijkheid toevoegen aan het jackson-core:

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Schrijven naar JSON

We kunnen JSON-inhoud rechtstreeks naar het OutputStream door een JsonGenerator klasse. Ten eerste moeten we de instantie van dat object maken:

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

Laten we vervolgens zeggen dat we een JSON willen schrijven met de volgende structuur:

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

We kunnen een instantie van de JsonGenerator om specifieke velden rechtstreeks naar het Uitgangsstroom:

jGenerator.writeStartObject (); jGenerator.writeStringField ("naam", "Tom"); jGenerator.writeNumberField ("leeftijd", 25); jGenerator.writeFieldName ("adres"); jGenerator.writeStartArray (); jGenerator.writeString ("Polen"); jGenerator.writeString ("5th avenue"); jGenerator.writeEndArray (); jGenerator.writeEndObject (); jGenerator.close ();

Om te controleren of de juiste JSON is gemaakt, kunnen we een Draad object met JSON-object erin:

String json = nieuwe String (stream.toByteArray (), "UTF-8"); assertEquals (json, "{\" naam \ ": \" Tom \ ", \" leeftijd \ ": 25, \" adres \ ": [\" Polen \ ", \" 5th avenue \ "]}");

4. JSON parseren

Wanneer we een JSON Draad als invoer, en we willen er specifieke velden uit halen, een JsonParser klasse kan worden gebruikt:

String json = "{\" naam \ ": \" Tom \ ", \" leeftijd \ ": 25, \" adres \ ": [\" Polen \ ", \" 5th avenue \ "]}"; JsonFactory jfactory = nieuwe JsonFactory (); JsonParser jParser = jfactory.createParser (json); String parsedName = null; Geheel getal parsedAge = null; Lijstadressen = nieuwe LinkedList ();

We willen verkrijgen parsedName, parsedAge en adressen velden van invoer JSON. Om dit te bereiken, moeten we parsinglogica op laag niveau afhandelen en deze zelf implementeren:

while (jParser.nextToken ()! = JsonToken.END_OBJECT) {String fieldname = jParser.getCurrentName (); if ("naam" .equals (veldnaam)) {jParser.nextToken (); parsedName = jParser.getText (); } if ("leeftijd" .equals (veldnaam)) {jParser.nextToken (); parsedAge = jParser.getIntValue (); } if ("adres" .equals (veldnaam)) {jParser.nextToken (); while (jParser.nextToken ()! = JsonToken.END_ARRAY) {adressen.add (jParser.getText ()); }}} jParser.close ();

Afhankelijk van de veldnaam extraheren we het en wijzen het toe aan een juist veld. Na het ontleden van het document moeten alle velden de juiste gegevens hebben:

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

5. Extractie van JSON-onderdelen

Soms, wanneer we een JSON-document ontleden, zijn we geïnteresseerd in slechts één bepaald veld.

Idealiter willen we in deze situaties alleen het begin van het document parseren en zodra het benodigde veld is gevonden, kunnen we de verwerking afbreken.

Laten we zeggen dat we alleen geïnteresseerd zijn in de leeftijd veld van de invoer JSON. In dit geval kunnen we parseerlogica implementeren om het parseren te stoppen zodra het benodigde veld is gevonden:

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

Na verwerking, de enige parsedAge veld zal een waarde hebben:

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

Dankzij dat zal het ontleden van het JSON-document een stuk sneller gaan omdat we niet het hele document hoeven te lezen, maar slechts een klein deel ervan.

6. Conclusie

In dit korte artikel bekijken we hoe we de Stream Processing API van Jackson kunnen gebruiken.

De implementatie van al deze voorbeelden en codefragmenten is te vinden op GitHub - dit is een Maven-project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.