首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按kotlinx.serialization生成的键排序的映射

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

Stack Overflow用户
提问于 2020-09-15 14:47:30
回答 1查看 1.8K关注 0票数 2

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

代码语言:javascript
复制
@Serializable
class Example(val map: Map<String, Int>)

并且它被序列化为

代码语言:javascript
复制
val example = Example(mapOf("b" to 2, "a" to 1, "c" to 3))
println(Json.encodeToString(example))

那么产生的json应该是

代码语言:javascript
复制
{
    "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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-16 09:14:26

弄明白了:

代码语言:javascript
复制
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>的答案会很好

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63904357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档