Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Real Collection Deserializer to parse arrays with GSON
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;
}
}
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());
}
}
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;
}
}
@amrafu

This comment has been minimized.

Show comment Hide comment
@amrafu

amrafu May 29, 2013

Nice solution, I used it but I got error on: CollectionDeserializer.java
...
@override
public Collection<?> deserialize(JsonElement json, Type typeOfT,
...

error:
The method deserialize(JsonElement, Type, JsonDeserializationContext) of type CollectionDeserializer must override a superclass method

Any idea?

Thanks in advance

amrafu commented May 29, 2013

Nice solution, I used it but I got error on: CollectionDeserializer.java
...
@override
public Collection<?> deserialize(JsonElement json, Type typeOfT,
...

error:
The method deserialize(JsonElement, Type, JsonDeserializationContext) of type CollectionDeserializer must override a superclass method

Any idea?

Thanks in advance

@miere

This comment has been minimized.

Show comment Hide comment
@miere

miere Jul 24, 2013

Hi @amrafu
Sorry by the late, I missed up your answer notification.

Please, which version of GSon are you using?
I will try to simulate your problem to help you! ;)

Owner

miere commented Jul 24, 2013

Hi @amrafu
Sorry by the late, I missed up your answer notification.

Please, which version of GSon are you using?
I will try to simulate your problem to help you! ;)

@daniel-andersen

This comment has been minimized.

Show comment Hide comment
@daniel-andersen

daniel-andersen Aug 31, 2014

Works great! Thanks! :-)

Works great! Thanks! :-)

@corentinc

This comment has been minimized.

Show comment Hide comment
@corentinc

corentinc Apr 1, 2015

Thanks! Exactly what I'm looking for!

Thanks! Exactly what I'm looking for!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment