Converting json to a java object
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(); } }
why won’t this work?
This tutorial is not detailed as “Java Gson – Convert json to a java object “. Difficult to understand.