For situations where performance is most critical, Jackson comes with Streaming API which is a high performance, sequential access api, with very low memory footprints and processing overhead.
Due to it’s incremental processing/sequential access nature, all content must be read/write in order as it arrives, so it’s bit hard to use. This API is mainly used by middle-ware and frameworks internally. On application level, to remain simple, usually data-binding or tree-model api’s are preferred(which in fact uses the Streaming API internally for JSON reading/writing).
On reading front, API comes with Parsers
which works like a pointer moving through individual tokens in JSON string and provide access to data of those tokens.
key, value, brackets [ { } ]
are all tokens.
On writing front, Generators
are available which writes JSON content. They provide methods to write individual tokens.
Let’s see how it is used exactly:
Step 1: Include JACKSON dependency in pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.websystique.xml</groupId> <artifactId>JsonJacksonStreamingExample</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <name>JsonJacksonStreamingExample</name> <dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency> </dependencies> </project>
Step 2: Write JSON using JsonGenerator
package com.websystique.json.jackson; import java.io.File; import java.io.IOException; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; public class JsonJacksonStreamingExample { public static void main(String args[]) throws JsonParseException, JsonMappingException, IOException{ JsonFactory factory = new JsonFactory(); /** * Write values in JSON format to a file */ JsonGenerator generator = factory.createGenerator(new File("result.json"), JsonEncoding.UTF8); generator.writeStartObject(); // write opening brace "{" generator.writeStringField("car", "Bentley"); //write key:value pair "car":"bentley" generator.writeNumberField("model", 2010); generator.writeNumberField("price", 98.700); generator.writeFieldName("colors"); generator.writeStartArray(); //write array opening brace "[" generator.writeString("gray"); //write individual array item generator.writeString("white"); generator.writeString("black"); generator.writeEndArray(); //write array closing brace "]" generator.writeEndObject(); // write closing brace "}" generator.close(); } }
Below is the output(result.json content)
{"car":"Bentley","model":2010,"price":98.7,"colors":["gray","white","black"]}
Step 3: Read JSON using JsonParser
package com.websystique.json.jackson; import java.io.File; import java.io.IOException; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.JsonMappingException; public class JsonJacksonStreamingExample { public static void main(String args[]) throws JsonParseException, JsonMappingException, IOException{ JsonFactory factory = new JsonFactory(); /** * Read values in json format */ JsonParser parser = factory.createParser(new File("result.json")); parser.nextToken(); //start reading the file while (parser.nextToken() != JsonToken.END_OBJECT) { //loop until "}" String fieldName = parser.getCurrentName(); if (fieldName.equals("car")) { parser.nextToken(); System.out.println("car : " + parser.getText()); } else if (fieldName.equals("model")) { parser.nextToken(); System.out.println("model : " + parser.getIntValue()); } else if (fieldName.equals("price")) { parser.nextToken(); System.out.println("price : " + parser.getFloatValue()); } else if (fieldName.equals("colors")) { parser.nextToken(); while (parser.nextToken() != JsonToken.END_ARRAY){ //loop until "]" System.out.println(parser.getText()); } } else { // unexpected token, generate error throw new IOException("Unrecognized field '"+fieldName+"'"); } } parser.close(); } }
Below is the output
car : Bentley model : 2010 price : 98.7 gray white black
That’s it. In the next post we will learn about frequently used Jackson Json annotations.
References
If you like tutorials on this site, why not take a step further and connect me on Facebook , Google Plus & Twitter as well? I would love to hear your thoughts on these articles, it will help improve further our learning process.