How to Parse JSON Array with Gson

JavaAndroidArraysJsonGson

Java Problem Overview


I want to parse JSON arrays and using gson. Firstly, I can log JSON output, server is responsing to client clearly.

Here is my JSON output:

 [
      {
           id : '1',
           title: 'sample title',
           ....
      },
      {
           id : '2',
           title: 'sample title',
           ....
     },
      ...
 ]

I tried this structure for parsing. A class, which depends on single array and ArrayList for all JSONArray.

 public class PostEntity {

      private ArrayList<Post> postList = new ArrayList<Post>();

      public List<Post> getPostList() { 
           return postList; 
      }

      public void setPostList(List<Post> postList) { 
           this.postList = (ArrayList<Post>)postList; 
      }	
 }

Post class:

 public class Post {
 
      private String id;
      private String title;

      /* getters & setters */
 }

When I try to use gson no error, no warning and no log:

 GsonBuilder gsonb = new GsonBuilder();
 Gson gson = gsonb.create();

 PostEntity postEnt;
 JSONObject jsonObj = new JSONObject(jsonOutput);
 postEnt = gson.fromJson(jsonObj.toString(), PostEntity.class);

 Log.d("postLog", postEnt.getPostList().get(0).getId());

What's wrong, how can I solve?

Java Solutions


Solution 1 - Java

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.

Solution 2 - Java

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;
	}
	
}

Solution 3 - Java

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());

Solution 4 - Java

Type listType = new TypeToken<List<Post>>() {}.getType();
List<Post> posts = new Gson().fromJson(jsonOutput.toString(), listType);

Solution 5 - Java

Some of the answers of this post are valid, but using TypeToken, the Gson library generates a Tree objects whit unreal types for your application.

To get it I had to read the array and convert one by one the objects inside the array. Of course this method is not the fastest and I don't recommend to use it if you have the array is too big, but it worked for me.

It is necessary to include the Json library in the project. If you are developing on Android, it is included:

/**
 * Convert JSON string to a list of objects
 * @param sJson String sJson to be converted
 * @param tClass Class
 * @return List<T> list of objects generated or null if there was an error
 */
public static <T> List<T> convertFromJsonArray(String sJson, Class<T> tClass){

    try{
        Gson gson = new Gson();
        List<T> listObjects = new ArrayList<>();

        //read each object of array with Json library
        JSONArray jsonArray = new JSONArray(sJson);
        for(int i=0; i<jsonArray.length(); i++){

            //get the object
            JSONObject jsonObject = jsonArray.getJSONObject(i);

            //get string of object from Json library to convert it to real object with Gson library
            listObjects.add(gson.fromJson(jsonObject.toString(), tClass));
        }

        //return list with all generated objects
        return listObjects;

    }catch(Exception e){
        e.printStackTrace();
    }

    //error: return null
    return null;
}

Solution 6 - Java

You can easily do this in Kotlin using the following code:

val fileData = "your_json_string"
val gson = GsonBuilder().create()
val packagesArray = gson.fromJson(fileData , Array<YourClass>::class.java).toList()

Basically, you only need to provide an Array of YourClass objects.

Solution 7 - Java

[
      {
           id : '1',
           title: 'sample title',
           ....
      },
      {
           id : '2',
           title: 'sample title',
           ....
     },
      ...
 ]

Check Easy code for this output

 Gson gson=new GsonBuilder().create();
                List<Post> list= Arrays.asList(gson.fromJson(yourResponse.toString,Post[].class));

Solution 8 - Java

in Kotlin :

val jsonArrayString = "['A','B','C']"

val gson = Gson()

val listType: Type = object : TypeToken<List<String?>?>() {}.getType()

val stringList : List<String> = gson.fromJson(
                            jsonArrayString,
                            listType)

Solution 9 - Java

you can get List value without using Type object.

EvalClassName[] evalClassName;
ArrayList<EvalClassName> list;
evalClassName= new Gson().fromJson(JSONArrayValue.toString(),EvalClassName[].class);
list = new ArrayList<>(Arrays.asList(evalClassName));

I have tested it and it is working.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionOgulcan OrhanView Question on Stackoverflow
Solution 1 - JavayorkwView Answer on Stackoverflow
Solution 2 - JavaMiereView Answer on Stackoverflow
Solution 3 - JavaxrcwrnView Answer on Stackoverflow
Solution 4 - JavaSalman khanView Answer on Stackoverflow
Solution 5 - JavaJ.S.R - SilicornioView Answer on Stackoverflow
Solution 6 - Javaxarlymg89View Answer on Stackoverflow
Solution 7 - JavaPrabh deepView Answer on Stackoverflow
Solution 8 - JavaAdnan Abdollah ZakiView Answer on Stackoverflow
Solution 9 - JavaSumit KumarView Answer on Stackoverflow