在Kotlin中使用gson反序列化泛型类型

enxuqcxy  于 2022-11-06  发布在  Kotlin
关注(0)|答案(1)|浏览(245)

我有一个泛型类型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,所以我不能添加该字段。

vd8tlhqk

vd8tlhqk1#

typeOfAnimal是必需的,因为gson必须知道应该选择哪个类来反序列化你的json。没有办法猜测类型,但是你可以implement your own deserializator。在一个自定义的反序列化器中,你可以实现如下逻辑:

if (jsonObject.get("barkVolume") != null) {
    // retun Dog object
}

相关问题