我有一个泛型类型Animal实现为一个密封类,它可以是Dog或Cat。
sealed class Animal(val typeOfAnimal: String) {
data class Dog(val barkVolume: Int): Animal("dog")
data class Cat(val hasStripes: Boolean): Animal("cat")
}
根据http://jansipke.nl/serialize-and-deserialize-a-list-of-polymorphic-objects-with-gson/,您可以通过注册RuntimeTypeAdapterFactory来反序列化Animal
val animalAdapterFactory = RuntimeTypeAdapterFactory.of(Animal::class.java, "typeOfAnimal").registerSubtype(Dog::class.java, Dog::class.java.qualifiedName).registerSubtype(Cat::class.java, Cat::class.java.qualifiedName)
gson = GsonBuilder().registerTypeAdapterFactory(animalAdapterFactory)
但如果我试图反序列化一个看起来像
jsonStr = "{barkVolume: 100}"
gson.fromJson(json, Animal::class.java)
RuntimeTypeAdapterFactory抱怨它无法反序列化Animal,因为它没有定义名为“typeOfAnimal”的字段
据我所知,typeOfAnimal是一个用来区分子类型的字段,而不是反序列化json中所需的字段。因为我的json实际上来自api,所以我不能添加该字段。
1条答案
按热度按时间vd8tlhqk1#
typeOfAnimal
是必需的,因为gson必须知道应该选择哪个类来反序列化你的json。没有办法猜测类型,但是你可以implement your own deserializator。在一个自定义的反序列化器中,你可以实现如下逻辑: