假设我有以下课程:
public class Dog {
public String name = "Edvard";
}
public class Animal {
public Dog madDog = new Dog();
}
Run Code Online (Sandbox Code Playgroud)
如果我通过Gson运行它,它会将其序列化如下:
GSon gson = new GSon();
String json = gson.toJson(new Animal())
result:
{
"madDog" : {
"name":"Edvard"
}
}
Run Code Online (Sandbox Code Playgroud)
这非常好,但我想用Gson自动为所有类添加className,所以我得到以下结果:
{
"madDog" : {
"name":"Edvard",
"className":"Dog"
},
"className" : "Animal"
}
Run Code Online (Sandbox Code Playgroud)
有谁知道这是可能的某种拦截器或与Gson的东西?
Jes*_*son 16
请看一下: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));
Run Code Online (Sandbox Code Playgroud)
为此,您将需要自定义序列化器。这是上面 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's member variables and add them to the JO accordingly
return jo;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您需要通过 GsonBuilder 实例化一个新的 Gson() 对象,以便根据需要附加序列化器:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Dog.class, new DogSerializer())
.registerTypeAdapter(Animal.class, new AnimalSerializer())
.create();
Run Code Online (Sandbox Code Playgroud)