Streaming API reads and writes discrete events to JSON content. JsonParser reads the data, while JsonGenerator writes the data. It is the most efficient method of the three, with the lowest overhead and the fastest read/write operation. It's similar to the Stax parser for XML.
In this article, we will show how to read and write JSON data using Jackson's streaming API. Streaming APIs work using JSON for every detail must be handled with caution. The following example will use two classes:
JsonGenerator class - writes to JSON string.
sonGenerator is the base class that defines Json content written by public APIs. Create an instance using the factory method of the JsonFactory instance.
Class declarations The following is the declaration of the org.codehaus.jackson.JsonGenerator class:
public abstract class JsonGenerator extends Object implements Closeable
Nested classes
| SN | Classes and descriptions |
|---|---|
| 1 | static class JsonGenerator.Feature// Enumeration defines all togglable functions of the generator. |
Constructor
| SN | Classes and descriptions |
|---|---|
| 1 | Default constructor |
JsonParser class - parses JSON strings.
JsonParser is the base class that defines Json content used by the public API to read. Create an instance using the factory method of the JsonFactory instance.
Class declarations The following is the declaration of the org.codehaus.jackson.JsonParser class:
public abstract class JsonParser extends Object implements Closeable, Versioned
Nested classes
| SN | Classes and descriptions |
|---|---|
| 1 | static class JsonParser.Feature //Enumeration defines all togglable functions of parser. |
| 2 | static class JsonParser.NumberType // Enumerations can be used for possible "local" (optimal) types of numbers. |
Constructor
| SN | Classes and descriptions |
|---|---|
| 1 | protected JsonParser() //Default constructor |
| 2 | protected JsonParser(int features) |
Inherited Method This class inherits the following class methods:
The code copy is as follows:
java.lang.Object
Write to JSON using JsonGenerator
Using JsonGenerator is very simple. First, use the JsonFactory.createJsonGenerator() method to create a JsonGenerator, and use the write***() method to write each JSON value.
JsonFactory jasonFactory = new JsonFactory();JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File( "student.json"), JsonEncoding.UTF8);// {jsonGenerator.writeStartObject();// "name" : "Mahesh Kumar"jsonGenerator.writeStringField("name", "Mahesh Kumar");Let's take a look at the JsonGenerator operation. Create a Java class file named JacksonTester in directory C:/> Jackson_WORKSPACE.
File: JacksonTester.java
import java.io.File;import java.io.IOException;import java.util.Map;import org.codehaus.jackson.JsonEncoding;import org.codehaus.jackson.JsonFactory;import org.codehaus.jackson.JsonGenerator;import org.codehaus.jackson.JsonParseException;import org.codehaus.jackson.map.JsonMappingException;import org.codehaus.jackson.map.ObjectMapper;public class JacksonTester { public static void main(String args[]){ JacksonTester tester = new JacksonTester(); try { JsonFactory jasonFactory = new JsonFactory(); JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File( "student.json"), JsonEncoding.UTF8); // { jsonGenerator.writeStartObject(); // "name" : "Mahesh Kumar" jsonGenerator.writeStringField("name", "Mahesh Kumar"); // "age" : 21 jsonGenerator.writeNumberField("age", 21); // "verified" : false jsonGenerator.writeBooleanField("verified", false); // "marks" : [100, 90, 85] jsonGenerator.writeFieldName("marks"); // [ jsonGenerator.writeStartArray(); // 100, 90, 85 jsonGenerator.writeNumber(100); jsonGenerator.writeNumber(90); jsonGenerator.writeNumber(85); // ] jsonGenerator.writeEndArray(); // } jsonGenerator.writeEndObject(); jsonGenerator.close(); //result student.json //{ // "name":"Mahesh Kumar", // "age":21, // "verified":false, // "marks":[100,90,85] //} ObjectMapper mapper = new ObjectMapper(); Map<String,Object> dataMap = mapper.readValue(new File("student.json"), Map.class); System.out.println(dataMap.get("name")); System.out.println(dataMap.get("age")); System.out.println(dataMap.get("verified")); System.out.println(dataMap.get("marks")); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}Verification results
Use javac to compile the following class:
The code copy is as follows:
C:/Jackson_WORKSPACE>javac JacksonTester.java
Now run jacksonTester to see the result:
The code copy is as follows:
C:/Jackson_WORKSPACE>java JacksonTester
Verify the output
Mahesh Kumar21false[100, 90, 85]
Read JSON using JsonParser
Using JsonParser is very simple. First create a JsonParser using JsonFactory.createJsonParser() method and use its nextToken() method to read each JSON string as a tag. Check each token and the corresponding process.
JsonFactory jasonFactory = new JsonFactory();JJsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json"));while (jsonParser.nextToken() != JsonToken.END_OBJECT) { //get the current token String fieldname = jsonParser.getCurrentName(); if ("name".equals(fieldname)) { //move to next token jsonParser.nextToken(); System.out.println(jsonParser.getText()); }}Let's take a look at JsonParser's operations. Create a class named JacksonTester in Java in folder C:/> Jackson_WORKSPACE.
File: JacksonTester.java
import java.io.File;import java.io.IOException;import org.codehaus.jackson.JsonEncoding;import org.codehaus.jackson.JsonFactory;import org.codehaus.jackson.JsonGenerator;import org.codehaus.jackson.JsonParseException;import org.codehaus.jackson.JsonParser;import org.codehaus.jackson.JsonToken;import org.codehaus.jackson.map.JsonMappingException;public class JacksonTester { public static void main(String args[]){ JacksonTester tester = new JacksonTester(); try { JsonFactory jasonFactory = new JsonFactory(); JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File( "student.json"), JsonEncoding.UTF8); jsonGenerator.writeStartObject(); jsonGenerator.writeStringField("name", "Mahesh Kumar"); jsonGenerator.writeNumberField("age", 21); jsonGenerator.writeBooleanField("verified", false); jsonGenerator.writeFieldName("marks"); jsonGenerator.writeStartArray(); // [ jsonGenerator.writeNumber(100); jsonGenerator.writeNumber(90); jsonGenerator.writeNumber(85); jsonGenerator.writeEndArray(); jsonGenerator.writeEndObject(); jsonGenerator.close(); //result student.json //{ // "name":"Mahesh Kumar", // "age":21, // "verified":false, // "marks":[100,90,85] //} JsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json")); while (jsonParser.nextToken() != JsonToken.END_OBJECT) { //get the current token String fieldname = jsonParser.getCurrentName(); if ("name".equals(fieldname)) { //move to next token jsonParser.nextToken(); System.out.println(jsonParser.getText()); } if("age".equals(fieldname)){ //move to next token jsonParser.nextToken(); System.out.println(jsonParser.getNumberValue()); } if("verified".equals(fieldname)){ //move to next token jsonParser.nextToken(); System.out.println(jsonParser.getBooleanValue()); } if("marks".equals(fieldname)){ //move to [ jsonParser.nextToken(); // loop till token equal to "]" while (jsonParser.nextToken() != JsonToken.END_ARRAY) { System.out.println(jsonParser.getNumberValue()); } } } } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}Verification results
Compile Use javac to compile the following classes:
The code copy is as follows:
C:/Jackson_WORKSPACE>javac JacksonTester.java
Now run jacksonTester and see the result as follows:
The code copy is as follows:
C:/Jackson_WORKSPACE>java JacksonTester
Verify the output
Mahesh Kumar21false[100, 90, 85]