Kotlin数据类+ Gson:可选字段

时间:2018-12-19 14:21:28

标签: kotlin gson

我在Kotlin中具有以下数据类:

import com.google.gson.annotations.SerializedName

data class RouteGroup(
    @SerializedName("name") var name: String,
    @SerializedName("id") var id: Int
)

有时我需要创建一个同时包含两个字段的对象,有时仅包含其中一个。

我该怎么做?

编辑

这不是此问题的重复项:Can Kotlin data class have more than one constructor? 该问题显示了如何为字段设置默认值。但就我而言,我不需要使用默认值对字段进行序列化。我希望仅在明确为其分配值时才对字段进行序列化。

2 个答案:

答案 0 :(得分:3)

使用空值运算符很容易

import com.google.gson.annotations.SerializedName

data class RouteGroup @JvmOverloads constructor(
    @SerializedName("name") var name: String? = null,
    @SerializedName("id") var id: Int? = null
)

答案 1 :(得分:1)

您可能需要这样的东西:

sealed class RouteGroup

data class RouteGroupWithName(
    @SerializedName("name") var name: String
) : RouteGroup()

data class RouteGroupWithId(
    @SerializedName("id") var id: Int
) : RouteGroup()

data class RouteGroupWithNameAndId(
    @SerializedName("name") var name: String,
    @SerializedName("id") var id: Int
) : RouteGroup()

编辑1:

或者您可以使用可为空的字段和命名参数,如下所示:

data class RouteGroup(
    @SerializedName("name") var name: String? = null,
    @SerializedName("id") var id: Int? = null
)

val routeGroupWithName = RouteGroup(name = "example")
val routeGroupWithId = RouteGroup(id = 2)
val routeGroupWithNameAndId = RouteGroup(id = 2, name = "example")