Java Google Json (Gson) Serializing Generics – Studytrails (original) (raw)

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

}

}

Animal class

package com.studytrails.json.gson;

public class Animal {

public T animal;

public void setAnimal(T animal) {
    this.animal = animal;
}

public T get() {
    return animal;
}

}

Dog Class

package com.studytrails.json.gson;

public class Dog { private String name;

public Dog(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

}