首页 > 解决方案 > 如何用gson序列化实现接口的类?

问题描述

有一个接口A:

interface A {
    val name: String
}

还有一个 B 类实现了这个接口:

class B() : A {
    val implementedName: String = "Test"

    override val name: String
        get() = implementedName
}

然后我尝试序列化这个B类:

val b: A = B()
Gson().toJson(b)

并得到以下输出:

// Output
{"implementedName":"Test"}

我意识到用于类型擦除的 gson 无法推断变量 b 的类型,但我想看到的是 gson 序列化接口字段:

// Output
{"name":"Test"}

我怎样才能做到这一点?

标签: kotlinserializationgson

解决方案


格森做不到。使用 SerializedName 注解 Android Studio 强调这是不可能的。此注释不适用于没有支持字段或委托的目标成员属性。但是以这种方式实施它应该有效。

interface A {
    val name: String
}

class B() : A {
    @SerializedName("your_name")
    override val name: String = "Test"
}

然后使用 Gson().toJson(b) 输出应该是:

{"your_name": "Test"}

推荐阅读