【问题标题】:How to serialize a class implementing a interface with gson?如何用gson序列化实现接口的类?
【发布时间】:2021-01-29 02:42:07
【问题描述】:

有一个接口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"}

我怎样才能做到这一点?

【问题讨论】:

    标签: kotlin serialization gson


    【解决方案1】:

    Gson 无法做到这一点。使用 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"}
    

    【讨论】:

    • 这对我不适用 我有不同的类实现接口 A 并且所有的类都应该能够实现 name 字段但是想要的。但是它们中的每个类在序列化时都应该具有相同的 json 结构。
    • @natschz 你不能用抽象类代替接口吗?
    • 所以对我来说,它并不是那么简单,它是一个更复杂的对象,嵌套对象也有相同的问题,它们实现接口。我只是想知道是否真的有必要自己实现这个映射对象。这意味着要么完全自己映射对象,要么创建一个实现接口的其他类,然后将原始/实现的类映射到该接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多