Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止使用kotlin序列化序列化空值_Kotlin_Serialization_Json Deserialization - Fatal编程技术网

如何防止使用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
作为项目级设计决策