Gson автоматически добавляет имя класса
Допустим, у меня есть следующие классы:
public class Dog {
public String name = "Edvard";
}
public class Animal {
public Dog madDog = new Dog();
}
Если я запустил этот корыто Gson, он будет сериализовать его следующим образом:
GSon gson = new GSon();
String json = gson.toJson(new Animal())
result:
{
"madDog" : {
"name":"Edvard"
}
}
Это так хорошо, но я бы хотел добавить класс ClassName для всех классов автоматически с помощью Gson, поэтому я получаю следующий результат:
{
"madDog" : {
"name":"Edvard",
"className":"Dog"
},
"className" : "Animal"
}
Кто-нибудь знает, возможно ли это с помощью каких-то перехватчиков или что-то с Gson?
Ответы
Ответ 1
Взгляните на это: http://code.google.com/p/google-gson/source/browse/trunk/extras/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java
RuntimeTypeAdapterFactory<BillingInstrument> rta = RuntimeTypeAdapterFactory.of(
BillingInstrument.class)
.registerSubtype(CreditCard.class);
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(rta)
.create();
CreditCard original = new CreditCard("Jesse", 234);
assertEquals("{\"type\":\"CreditCard\",\"cvv\":234,\"ownerName\":\"Jesse\"}",
gson.toJson(original, BillingInstrument.class));
Ответ 2
Для этого вам понадобятся специальные сериализаторы. Вот пример для класса Animal выше:
public class AnimalSerializer implements JsonSerializer<Animal> {
public JsonElement serialize(Animal animal, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jo = new JsonObject();
jo.addProperty("className", animal.getClass().getName());
// or simply just
jo.addProperty("className", "Animal");
// Loop through the animal object member variables and add them to the JO accordingly
return jo;
}
}
Затем вам нужно создать экземпляр нового объекта Gson() через GsonBuilder для установки сериализаторов по желанию:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Dog.class, new DogSerializer())
.registerTypeAdapter(Animal.class, new AnimalSerializer())
.create();