问题描述
我需要用一个映射序列化一个类,以便映射中的键在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>
会很高兴