提问
嗨,我是kotlinx序列化的新手。json是snake case,kotlin数据类使用camel case。有没有一种方法可以通过使用自定义serilizer和parallelizer来解析snake case?
我知道怎么做...
val format = Json { namingStrategy = JsonNamingStrategy.SnakeCase }
val project = format.decodeFromString<Project>("""{"project_name":"kotlinx.coroutines", "project_owner":"Kotlin"}""")
assertThat(project.projectName).isEqualTo("kotlinx.coroutines")
assertThat(project.projectOwner).isEqualTo("Kotlin")
字符串
但是我想重写编译器并把这个逻辑放在伴随对象里面。这可能吗?
我的代码
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encodeToString
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.encoding.decodeStructure
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonNamingStrategy
@kotlinx.serialization.ExperimentalSerializationApi
private val json = Json { namingStrategy = JsonNamingStrategy.SnakeCase }
@Serializable(PaymentInfo.Companion::class)
data class PaymentInfo(
val paymentNo: String,
val paymentDate: String,
val paymentService: String,
) {
companion object: KSerializer<PaymentInfo> {
// what descriptor should I use?
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("PaymentInfo", PrimitiveKind.)
override fun serialize(encoder: Encoder, value: PaymentInfo) {
// what to do ?
}
override fun deserialize(decoder: Decoder): PaymentInfo {
// what to do ?
}
}
}
型
已编辑
我想避免添加@SerialName
到每个成员!
1条答案
按热度按时间ugmeyewa1#
@SerialName
首先,我想提一下,我不明白你为什么要避免
@SerialName
。你提到:恐怕太费力了。
但是正如你将在本答案的下一节中看到的,自定义序列化器是相当多的代码。同样的事情可以通过以下方式完成:
字符串
对于像更改属性的序列名称这样简单的操作,我强烈建议您使用
@SerialName
,而不是编写完全自定义的序列化程序。自定义序列化器
如果你真的想避免
@SerialName
,那么你可以通过自定义序列化器自定义序列化的名称。如果你有:型
您需要以下自定义名称:
| 类属性|系列产品名称|
| --|--|
|
paymentNo
个|payment_no
个||
paymentDate
个|payment_date
个||
paymentService
个|payment_service
个|那么自定义的
PaymentInfoSerializer
可能看起来像这样:型
有关详细信息,请参阅 * Kotlin序列化指南 * 的序列化器一章。
下面是上述序列化器的用途:
型
它给出以下输出:
型