如何防止使用kotlin序列化序列化空值
我使用的是如何防止使用kotlin序列化序列化空值,kotlin,serialization,json-deserialization,Kotlin,Serialization,Json Deserialization,我使用的是kotlinx序列化json 我有这门课: @Serializable data class Event( @SerialName("temperature") val temperature: Float?, @SerialName("pressure") val pressure: Float?, @SerialName("humidity") val humidity: Float?, ) 这个
kotlinx序列化json
我有这门课:
@Serializable
data class Event(
@SerialName("temperature") val temperature: Float?,
@SerialName("pressure") val pressure: Float?,
@SerialName("humidity") val humidity: Float?,
)
这个电话呢
Json.encodeToString(Event(temperature = 42.0f, pressure = null, humidity = 20.9f))
在序列化过程中,我收到这样的json:
{
"temperature": 20.5,
"pressure": null,
"humidity": 20.9
}
但我希望防止序列化空值并接收以下内容:
{
"temperature": 20.5,
"humidity": 20.9
}
这对我来说是个问题,因为在序列化冗长的事件列表时,我浪费了很多行。任何人都知道如何实现这一点吗?您可以忽略所有默认设置并执行以下操作:
@Serializable
数据类事件(
@SerialName(“温度”)val温度:浮点?,
@SerialName(“压力”)val压力:浮点?=null,
@SerialName(“湿度”)val湿度:浮动?,
)
val jsonMapper=Json{encodeDefaults=false}
val body=jsonMapper.encodeToString(事件(温度=42.0f,压力=null,湿度=20.9f))
请注意,在上述情况下,您将忽略所有默认设置。
如果只想忽略空值,则必须实现自定义序列化程序
对于此示例,自定义序列化程序如下所示:
对象事件序列化程序:KSerializer{
重写有趣的反序列化(解码器:解码器):事件{
解码器.解码结构(描述符){
变量温度:浮动?=null
变量湿度:浮动?=null
var压力:浮动?=零
while(true){
当(val索引=decodeElementIndex(描述符)){
0->温度=0(描述符,0)
1->压力=1(描述符,1)
2->湿度=湿度(描述符,2)
CompositeDecoder.DECODE_DONE->break
else->错误(“意外索引:$index”)
}
}
返回事件(温度、压力、湿度)
}
}
重写有趣的序列化(编码器:编码器,值:事件){
encoder.beginStructure(描述符)。运行{
value.temperature?.let{encodeStringElement(描述符,0,it.toString())}
value.pressure?.let{encodeStringElement(描述符,1,it.toString())}
value.湿度?.let{encodeStringElement(描述符,2,it.toString())}
端结构(描述符)
}
}
重写val描述符:SerialDescriptor=buildClassSerialDescriptor(“事件”){
元素(“温度”)
元素(“压力”)
元素(“湿度”)
}
}
要使用它->
@Serializable(with=EventSerializer::class)
您可以忽略所有默认值并执行以下操作:
@Serializable
数据类事件(
@SerialName(“温度”)val温度:浮点?,
@SerialName(“压力”)val压力:浮点?=null,
@SerialName(“湿度”)val湿度:浮动?,
)
val jsonMapper=Json{encodeDefaults=false}
val body=jsonMapper.encodeToString(事件(温度=42.0f,压力=null,湿度=20.9f))
请注意,在上述情况下,您将忽略所有默认设置。
如果只想忽略空值,则必须实现自定义序列化程序
对于此示例,自定义序列化程序如下所示:
对象事件序列化程序:KSerializer{
重写有趣的反序列化(解码器:解码器):事件{
解码器.解码结构(描述符){
变量温度:浮动?=null
变量湿度:浮动?=null
var压力:浮动?=零
while(true){
当(val索引=decodeElementIndex(描述符)){
0->温度=0(描述符,0)
1->压力=1(描述符,1)
2->湿度=湿度(描述符,2)
CompositeDecoder.DECODE_DONE->break
else->错误(“意外索引:$index”)
}
}
返回事件(温度、压力、湿度)
}
}
重写有趣的序列化(编码器:编码器,值:事件){
encoder.beginStructure(描述符)。运行{
value.temperature?.let{encodeStringElement(描述符,0,it.toString())}
value.pressure?.let{encodeStringElement(描述符,1,it.toString())}
value.湿度?.let{encodeStringElement(描述符,2,it.toString())}
端结构(描述符)
}
}
重写val描述符:SerialDescriptor=buildClassSerialDescriptor(“事件”){
元素(“温度”)
元素(“压力”)
元素(“湿度”)
}
}
要使用它->
@Serializable(with=EventSerializer::class)
谢谢,也许我会决定使用encodeDefaults=false
作为项目级设计决策谢谢,也许我会决定使用encodeDefaults=false
作为项目级设计决策