Java / GSON – Serializing and Deserializing Generic Types

gson - json

Quando você chama .toJson(obj) o Gson internamente usa obj.getClass() para obter informações sobre os campos para serializar. Da mesma forma na deserialização se passa MyClass.class no método fromJson(json, MyClass.class). Isso funciona bem se o objeto é um tipo não-genérico. No entanto, se o objeto é de um tipo genérico as informações são perdida porcausa da sua generalização. Segue um exemplo:

class Foo<T> {
  T value;
}

Gson gson = new Gson();

Foo<Bar> foo = new Foo<Bar>();
// Não pode serializar foo.value corretamente:
gson.toJson(foo);
// Falha ao deserializar foo.value as Bar:
gson.fromJson(json, foo.getClass()); 

O código acima não consegue interpretar  o valor como um tipo Bar porque o Gson invoca list.getClass() para pegar a informação da classe, mas esse método retorna uma classe cru, Foo.class. Isto significa que Gson não têm nenhuma maneira de saber que este é um objeto do tipo Foo <Bar>, e não simplesmente Foo.

Você pode resolver esse problema especificando o tipo correto para o seu tipo genérico. Você pode fazer isso usando a classe TypeToken veja o exemplo: Continue reading

Java / Gson – Convertendo json em lista tipada List (Gson – convert from Json to a typed ArrayList)

gson

O Gson é uma biblioteca Java que pode ser usada para converter objetos Java em sua representação JSON. Ele também pode ser usado para converter uma string JSON em um objeto Java equivalente. Gson pode trabalhar com objetos Java arbitrários, incluindo objetos pré-existentes que você não tem código fonte de. (Gson – Google)

A seguir segue um exemplo de como converter um JSON Array em uma lista de objetos: Continue reading