Parse JSON to Java using Streaming Jackson Parser

Parse JSON to Java – Streaming Parser and Generator

Jackson provides a low level API to parse JSON to Java. The API provides token for each json object. For example, the start of json ‘{‘ is the first object that the parser provides. The key value pair is another single object. The client code can use the tokens and get the json properties or build a java object out of it if required. This low level API is extremely powerful but needs a lot of coding. For most cases, Jackson’s tree traversing and data binding capability should be explored instead. We provide two examples below. The first example demonstrates json parsing and the second demonstrated json generation.

parse JSON to Java Example

package com.studytrails.json.jackson;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

/**
 * The aim of this class is to get the list of albums from free music archive
 * (limit to 5)
 * 
 */
public class StreamParser1 {
	public static void main(String[] args) throws MalformedURLException, IOException {
		// Get a list of albums from free music archive. limit the results to 5
		String url = "http://freemusicarchive.org/api/get/albums.json?api_key=60BLHNQCAOUFPIBZ&limit=5";
		// get an instance of the json parser from the json factory
		JsonFactory factory = new JsonFactory();
		JsonParser parser = factory.createParser(new URL(url));

		// continue parsing the token till the end of input is reached
		while (!parser.isClosed()) {
			// get the token
			JsonToken token = parser.nextToken();
			// if its the last token then we are done
			if (token == null)
				break;
			// we want to look for a field that says dataset

			if (JsonToken.FIELD_NAME.equals(token) && "dataset".equals(parser.getCurrentName())) {
				// we are entering the datasets now. The first token should be
				// start of array
				token = parser.nextToken();
				if (!JsonToken.START_ARRAY.equals(token)) {
					// bail out
					break;
				}
				// each element of the array is an album so the next token
				// should be {
				token = parser.nextToken();
				if (!JsonToken.START_OBJECT.equals(token)) {
					break;
				}
				// we are now looking for a field that says "album_title". We
				// continue looking till we find all such fields. This is
				// probably not a best way to parse this json, but this will
				// suffice for this example.
				while (true) {
					token = parser.nextToken();
					if (token == null)
						break;
					if (JsonToken.FIELD_NAME.equals(token) && "album_title".equals(parser.getCurrentName())) {
						token = parser.nextToken();
						System.out.println(parser.getText());
					}

				}

			}

		}

	}
}

Json Generation Example

package com.studytrails.json.jackson;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;

/**
 * 
 * In This example we look at generating a json using the jsongenerator. we will
 * be creating a json similar to
 * http://freemusicarchive.org/api/get/albums.json?
 * api_key=60BLHNQCAOUFPIBZ&limit=1, but use only a couple of fields
 * 
 */
public class StreamGenerator1 {
	public static void main(String[] args) throws IOException {
		JsonFactory factory = new JsonFactory();
		JsonGenerator generator = factory.createGenerator(new FileWriter(new File("albums.json")));

		// start writing with {
		generator.writeStartObject();
		generator.writeFieldName("title");
		generator.writeString("Free Music Archive - Albums");
		generator.writeFieldName("dataset");
		// start an array
		generator.writeStartArray();
		generator.writeStartObject();
		generator.writeStringField("album_title", "A.B.A.Y.A.M");
		generator.writeEndObject();
		generator.writeEndArray();
		generator.writeEndObject();

		generator.close();
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *