GSON - JsonReader

The GSON's JsonReader is the GSON streaming JSON parser. The GSON JsonReader enables us to read a JSON string or file as a stream of JSON tokens.
Using this we can Iterate over token of JSON

Creating a GSON JsonReader

new JsonReader(java.io.Reader in)	

Which creates a new instance that reads a JSON-encoded stream from 'in' parameter.

Key Methods of JSONReader

Signature Description
boolean hasNext() Returns true if the current array or object has another element.
void beginObject() Consumes the next token from the JSON stream and asserts that it is the beginning of a new object.(without using beginobject() can't read it's elements)
JsonToken peek() Returns the type of the next token without consuming it.
(JSONToekn is enum with constants BEGIN_ARRAY, BEGIN_OBJECT, BOOLEAN,NAME, NULL,NUMBER, STRING)
int nextInt() Returns the int value of the next token, consuming it.
long nextLong() Returns the long value of the next token, consuming it.
String nextString() Returns the String value of the next token, consuming it.

Iterating the JSON Tokens of a JsonReader

Once we have created a JsonReader instance we can iterate through the JSON tokens. It reads from the Reader passed to the JsonReader's constructor.
The main loop for iterating the JSON tokens of a JsonReader looks like this:
while(jsonReader.hasNext() {
}
The hasNext() method of the JsonReader returns true if the JsonReader has more tokens.
To access the tokens of the JsonReader we use a loop similar to the following:

/**
 * @author TutorialToUs.com
 */
package com.tutorialtous.gson;

import java.io.IOException;
import java.io.StringReader;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;

public class JSonReaderExample {
	public static void main(String args[]) {
		String jsonstring = "{\"name\":\"Alex\",\"age\":29}";
		JsonReader reader = new JsonReader(new StringReader(jsonstring));
		try {
			while (reader.hasNext()) {
				JsonToken nextToken = reader.peek();
				System.out.println("TokenType to Process:"+nextToken);
				if (JsonToken.BEGIN_OBJECT.equals(nextToken)) {
					reader.beginObject();
				} else if (JsonToken.NAME.equals(nextToken)) {
					String name = reader.nextName();
					System.out.println(name);
				} else if (JsonToken.STRING.equals(nextToken)) {
					String value = reader.nextString();
					System.out.println(value);
				} else if (JsonToken.NUMBER.equals(nextToken)) {
					long value = reader.nextLong();
					System.out.println(value);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
TokenType to Process:BEGIN_OBJECT
TokenType to Process:NAME
name
TokenType to Process:STRING
Alex
TokenType to Process:NAME
age
TokenType to Process:NUMBER
29

The JsonReader peek() method returns the next JSON token, but without moving over it.

Multiple calls to peek() subsequently will return the same JSON token.
The JsonToken returned by peek() can be compared to constants in the JsonToken class to find out what type of token it is. we can see that done in the loop above.
Inside each 'if' statement a JsonReader method is called which moves the JsonReader over the current token, and on to the next token. All of beginObject(), nextString() and nextLong() return the value of the current token and moves the internal pointer to the next.