How to Parse JSON Array with Gson How to Parse JSON Array with Gson android android

How to Parse JSON Array with Gson


You can parse the JSONArray directly, don't need to wrap your Post class with PostEntity one more time and don't need new JSONObject().toString() either:

Gson gson = new Gson();String jsonOutput = "Your JSON String";Type listType = new TypeToken<List<Post>>(){}.getType();List<Post> posts = gson.fromJson(jsonOutput, listType);

Hope that helps.


I was looking for a way to parse object arrays in a more generic way; here is my contribution:

CollectionDeserializer.java:

import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import com.google.gson.Gson;import com.google.gson.JsonArray;import com.google.gson.JsonDeserializationContext;import com.google.gson.JsonDeserializer;import com.google.gson.JsonElement;import com.google.gson.JsonParseException;public class CollectionDeserializer implements JsonDeserializer<Collection<?>> {    @Override    public Collection<?> deserialize(JsonElement json, Type typeOfT,            JsonDeserializationContext context) throws JsonParseException {        Type realType = ((ParameterizedType)typeOfT).getActualTypeArguments()[0];        return parseAsArrayList(json, realType);    }    /**     * @param serializedData     * @param type     * @return     */    @SuppressWarnings("unchecked")    public <T> ArrayList<T> parseAsArrayList(JsonElement json, T type) {        ArrayList<T> newArray = new ArrayList<T>();        Gson gson = new Gson();        JsonArray array= json.getAsJsonArray();        Iterator<JsonElement> iterator = array.iterator();        while(iterator.hasNext()){            JsonElement json2 = (JsonElement)iterator.next();            T object = (T) gson.fromJson(json2, (Class<?>)type);            newArray.add(object);        }        return newArray;    }}

JSONParsingTest.java:

public class JSONParsingTest {    List<World> worlds;    @Test    public void grantThatDeserializerWorksAndParseObjectArrays(){        String worldAsString = "{\"worlds\": [" +            "{\"name\":\"name1\",\"id\":1}," +            "{\"name\":\"name2\",\"id\":2}," +            "{\"name\":\"name3\",\"id\":3}" +        "]}";        GsonBuilder builder = new GsonBuilder();        builder.registerTypeAdapter(Collection.class, new CollectionDeserializer());        Gson gson = builder.create();        Object decoded = gson.fromJson((String)worldAsString, JSONParsingTest.class);        assertNotNull(decoded);        assertTrue(JSONParsingTest.class.isInstance(decoded));        JSONParsingTest decodedObject = (JSONParsingTest)decoded;        assertEquals(3, decodedObject.worlds.size());        assertEquals((Long)2L, decodedObject.worlds.get(1).getId());    }}

World.java:

public class World {    private String name;    private Long id;    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }}


To conver in Object Array

Gson gson=new Gson();ElementType [] refVar=gson.fromJson(jsonString,ElementType[].class);

To convert as post type

Gson gson=new Gson();Post [] refVar=gson.fromJson(jsonString,Post[].class);

To read it as List of objects TypeToken can be used

List<Post> posts=(List<Post>)gson.fromJson(jsonString,                      new TypeToken<List<Post>>(){}.getType());