相当于Jackson的JsonUnwrapped在kotlinx.serialization中的用法

q0qdq0h2  于 2023-02-09  发布在  Kotlin
关注(0)|答案(1)|浏览(114)

我有一个类,如:

@Serializable
data class Example(
   val id: Int
   val items: Map<String, Int>
)

val instance = Example(1, hashMapOf("one" to 1, "two" to 2))

如何让Kotlin序列化在序列化期间将itemsMap的键提升到Example对象中?如果我使用Jackson,我会用@JsonUnwrapped注解items属性。
我尝试了默认的序列化,items属性是它自己的键,哈希Map表示为一个对象:

{ 
   "id": 1,
   "items": {
               "one": 1,
               "two": 2
            }
}

而我希望这个对象被序列化,就像这样:

{ 
   "id": 1,   
   "one": 1,
   "two": 2
}
juud5qan

juud5qan1#

您可以使用以下命令:

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))
}

相关问题