首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在kotlin中使用gson反序列化泛型类型

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

Stack Overflow用户
提问于 2022-07-11 21:20:39
回答 1查看 89关注 0票数 0

我有一个作为密封类实现的泛型动物,它可以是狗或猫。

代码语言:javascript
复制
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来反序列化动物

代码语言:javascript
复制
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)

但是如果我试图反序列化一种动物

代码语言:javascript
复制
jsonStr = "{barkVolume: 100}"
gson.fromJson(json, Animal::class.java)

RuntimeTypeAdapterFactory抱怨它不能反序列化动物,因为它没有定义一个名为"typeOfAnimal“的字段

据我理解,typeOfAnimal是您添加的一个字段,用于区分子类型,而不是您正在反序列化的json中需要的内容。因为我的json实际上来自一个api,所以我不能添加这个字段。

EN

回答 1

Stack Overflow用户

发布于 2022-07-11 22:03:30

typeOfAnimal是必需的,因为gson必须知道应该选择哪个类来反序列化您的json。无法猜测类型,但您可以实现您自己的反序列化器。在自定义反序列化器中,可以实现如下逻辑:

代码语言:javascript
复制
if (jsonObject.get("barkVolume") != null) {
    // retun Dog object
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72944789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档