将Kotlin嵌套类序列化为平面JSON
我正在寻找一种标准化的方法,在JVM上使用kotlinx.serialization将Kotlin对象序列化为只包含键->值对的“平面”Json 例如:将Kotlin嵌套类序列化为平面JSON,json,kotlin,serialization,Json,Kotlin,Serialization,我正在寻找一种标准化的方法,在JVM上使用kotlinx.serialization将Kotlin对象序列化为只包含键->值对的“平面”Json 例如: @Serializable data class Address(val street: String, val postalCode: String) @Serializable data class Customer(val id: String, val name: String, val address: Address) 序列化时
@Serializable
data class Address(val street: String, val postalCode: String)
@Serializable
data class Customer(val id: String, val name: String, val address: Address)
序列化时的默认行为是:
{
"id": "123ABC",
"name": "Joe"
"address": {
"street": "my street",
"postalCode": "123456"
}
}
我想要的是:
{
"id": "123ABC",
"name": "Joe"
"street": "my street",
"postalCode": "123456"
}
我找不到一个方法来完成这项工作。因此,我非常确定我必须实现一个定制的KSerializer
,但目前不知道如何实现行为。这可以通过以下技术实现:
import kotlinx.serialization.descriptor.SerialDescriptor
导入kotlinx.serialization.encoding.Decoder
导入kotlinx.serialization.encoding.Encoder
导入kotlinx.serialization.json*
导入kotlinx.serialization*
@可序列化
数据类地址(val street:String,val postalCode:String)
@可序列化(with=CustomerSerializer::class)
数据类客户(val id:String,val名称:String,val地址:address)
@可序列化
@序列号(“客户”)
私有数据类CustomerSurrogate(val id:String,val名称:String,val street:String,val postalCode:String)
对象CustomerSerializer:k序列化器{
重写val描述符:SerialDescriptor=CustomerSurrogate.serializer().descriptor
重写有趣的反序列化(解码器:解码器):客户{
val代理=解码器.decodeSerializableValue(CustomerSurrogate.serializer())
返回客户(subrogate.id、subrogate.name、地址(subrogate.street、subrogate.postalCode))
}
重写有趣的序列化(编码器:编码器,值:客户){
val代理=CustomerSurrogate(value.id、value.name、value.address.street、value.address.postalCode)
encoder.encodeSerializableValue(CustomerSurrogate.serializer(),代理)
}
}
主要内容(){
println(Json.encodeToString(客户(“123ABC”、“Joe”、地址(“我的街道”、“123456”))
}