【发布时间】:2021-08-13 02:52:42
【问题描述】:
我有以下类(为了清楚起见删除了一些细节),并使用 kotlinx-serialization 1.2.1 和 kotlin 1.5 将它们序列化为 JSON:
@Serializable
data class FieldModifier<T>(
@Transient private val original: T? = null,
var set: T? = null,
var unset: T? = null
)
@Serializable
data class IssueModifier(
val summary: FieldModifier<String> = FieldModifier(),
val description: FieldModifier<String> = FieldModifier(),
val storyPoints: FieldModifier<Double> = FieldModifier(),
val spentSp: FieldModifier<Double> = FieldModifier(),
val originalStoryPoints: FieldModifier<Double> = FieldModifier()
)
在下面的用例中一切正常:
val format = Json {
prettyPrint = true
ignoreUnknownKeys = true
}
val modifier = IssueModifier()
modifier.spentSp.set = 2.5
println(format.encodeToString(modifier))
我得到以下预期的 JSON:
{
"spentSp": {
"set": 2.5
}
}
但是如果我向瞬态“原始”属性添加一些非空值
val modifier = IssueModifier(
summary = FieldModifier("some summary"),
description = FieldModifier("some description")
)
modifier.spentSp.set = 2.5
println(format.encodeToString(modifier))
那么 JSON 包含“summary”和“description”属性的意外空对象:
{
"summary": {
},
"description": {
},
"spentSp": {
"set": 2.5
}
}
这是正确的行为吗?我希望与第一种情况相同的 JSON,因为“原始”属性是瞬态的,因此它不应该影响输出。
我怎样才能避免这种情况?我是否应该覆盖 FieldModifier 类的 hashCode()/equals() 方法以从它们中排除“原始”字段(在这种情况下,框架可能会将FieldModifier("some summary") 视为默认值FieldModifier())?还有其他想法吗?
【问题讨论】:
标签: json kotlin serialization