In the earlier tutorials we saw how to convert json to a java object. In This tutorial we see how to parse json and obtain individual tokens. Although this may seem like a cumbersome way to build java object from json, however it is extremely powerful and may be a good choice if you need a very high level of control over the parsing. We use the JsonReader class to read the json as a stream of tokens. The beginning of an object or an array is also a token. Here’s a detailed example.
package com.studytrails.json.gson;
import java.io.IOException;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.commons.io.IOUtils;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
public class ParseTokenExample7
{
public static void main(String[] args) throws MalformedURLException, IOException
{
String url = "http://freemusicarchive.org/api/get/albums.json?api_key=60BLHNQCAOUFPIBZ&limit=1";
String json = IOUtils.toString(new URL(url));
// use the reader to read the json to a stream of tokens
JsonReader reader = new JsonReader(new StringReader(json));
// we call the handle object method to handle the full json object. This
// implies that the first token in JsonToken.BEGIN_OBJECT, which is
// always true.
handleObject(reader);
}
/**
* Handle an Object. Consume the first token which is BEGIN_OBJECT. Within
* the Object there could be array or non array tokens. We write handler
* methods for both. Noe the peek() method. It is used to find out the type
* of the next token without actually consuming it.
*
* @param reader
* @throws IOException
*/
private static void handleObject(JsonReader reader) throws IOException
{
reader.beginObject();
while (reader.hasNext()) {
JsonToken token = reader.peek();
if (token.equals(JsonToken.BEGIN_ARRAY))
handleArray(reader);
else if (token.equals(JsonToken.END_OBJECT)) {
reader.endObject();
return;
} else
handleNonArrayToken(reader, token);
}
}
/**
* Handle a json array. The first token would be JsonToken.BEGIN_ARRAY.
* Arrays may contain objects or primitives.
*
* @param reader
* @throws IOException
*/
public static void handleArray(JsonReader reader) throws IOException
{
reader.beginArray();
while (true) {
JsonToken token = reader.peek();
if (token.equals(JsonToken.END_ARRAY)) {
reader.endArray();
break;
} else if (token.equals(JsonToken.BEGIN_OBJECT)) {
handleObject(reader);
} else if (token.equals(JsonToken.END_OBJECT)) {
reader.endObject();
} else
handleNonArrayToken(reader, token);
}
}
/**
* Handle non array non object tokens
*
* @param reader
* @param token
* @throws IOException
*/
public static void handleNonArrayToken(JsonReader reader, JsonToken token) throws IOException
{
if (token.equals(JsonToken.NAME))
System.out.println(reader.nextName());
else if (token.equals(JsonToken.STRING))
System.out.println(reader.nextString());
else if (token.equals(JsonToken.NUMBER))
System.out.println(reader.nextDouble());
else
reader.skipValue();
}
}
(Note: This article’s original links is here )