As we saw in the previous tutorial serializing and deserializing classes with generic types is non trivial since generic type information is lost while serializing. Gson provides a class called com.google.gson.reflect.TypeToken to store generic types. The example below shows how to use the TypeToken class to serialize and deserialize Classes with generic types.
package com.studytrails.json.gson;
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class GenericTypesExample8 {
public static void main(String[] args) {
// create an animal class that is of type dog.
Animal animal = new Animal<Dog>();
// Create a Dog instance
Dog dog = new Dog("I am a dog");
animal.setAnimal(dog);
Gson gson = new Gson();
// Define a Type that is an Animal of type dog.
Type animalType = new TypeToken<Animal<Dog>>() {
}.getType();
// we first convert the animal object to a json and then read the json
// back. However we define the json to be of Animal type
Animal animal1 = gson.fromJson(gson.toJson(animal, animalType), Animal.class);
System.out.println(animal1.get().getClass()); // prints class
// com.google.gson.internal.LinkedTreeMap
// In contrast to above where we read the json back using the Animal
// type, here we read the json back as the custom animalType Type. This
// gives Gson an idea of what
// the generic type should be.
Animal animal2 = gson.fromJson(gson.toJson(animal), animalType);
System.out.println(animal2.get().getClass());
// prints class com.studytrails.json.gson.Dog
}
}
package com.studytrails.json.gson;
public class Animal {
public T animal;
public void setAnimal(T animal) {
this.animal = animal;
}
public T get() {
return animal;
}
}
package com.studytrails.json.gson;
public class Dog {
private String name;
public Dog(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
(Note: This article’s original links is here )