微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

映射按由kotlinx.serialization生成的键排序

如何解决映射按由kotlinx.serialization生成的键排序

我需要用一个映射序列化一个类,以便映射中的键在json中排序。所以如果有课

@Serializable
class Example(val map: Map<String,Int>)

,并使用

进行序列化
val example = Example(mapOf("b" to 2,"a" to 1,"c" to 3))
println(Json.encodetoString(example))

然后生成的json应该是

{
    "map": {
        "a": 1,"b": 2,"c": 3
    }
}

我尝试使用SortedMap而不是Map,但这会引发异常:

kotlinx.serialization.SerializationException:类'TreeMap'未注册为'SortedMap'范围内的多态序列化

如何使用kotlinx.serialization获取排序的json?

(kotlin 1.4.0,kotlinx.serialization 1.0.0-RC)

解决方法

想通了:

import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.builtins.*
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

object SortedMapSerializer: KSerializer<Map<String,Int>> {
    private val mapSerializer = MapSerializer(String.serializer(),Int.serializer())
    
    override val descriptor: SerialDescriptor = mapSerializer.descriptor

    override fun serialize(encoder: Encoder,value: Map<String,Int>) {
        mapSerializer.serialize(encoder,value.toSortedMap())
    }

    override fun deserialize(decoder: Decoder): Map<String,Int> {
        return mapSerializer.deserialize(decoder)
    }
}

@Serializable
class Example(
    @Serializable(with = SortedMapSerializer::class)
    val map: Map<String,Int>
)

fun main() {
    val example = Example(mapOf("b" to 2,"c" to 3,"a" to 1))
    println(Json.encodeToString(
        example
    ))
}

(尽管回答Map<Serializable,Serializable>会很高兴

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。