gpt4 book ai didi

kotlin - 映射按使用 kotlinx.serialization 生成的键排序

转载 作者:行者123 更新时间:2023-12-02 02:39:06 28 4
gpt4 key购买 nike

我需要用 map 序列化一个类,以便 map 中的键在 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: Class 'TreeMap' is not registered for polymorphic serialization in the scope of '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> 有一个答案会很好

关于kotlin - 映射按使用 kotlinx.serialization 生成的键排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63904357/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com