如何将一个Kotlin集合序列化为一个值为空对象的JSON对象?

9lowa7mx  于 2022-12-19  发布在  Kotlin
关注(0)|答案(1)|浏览(239)

我想使用Kotlin序列化使Kotlin类可序列化。
这个类非常简单,大概是这样的:

@Serializable(with = CustomSerializer::class)
data class MyObject(val keys: Set<String>)

现在,我需要序列化格式为JSON对象,其中键由Set<String>给出,值始终为空JSON对象。
示例:

val example = MyObject(setOf("abc", "def"))

应序列化为:

{ "abc": {}, "def": {} }

原因是这个对象被发送到一个API,他们希望JSON看起来像这样...空对象可以包含一些指令,但我不想或不需要使用这些指令。
仅通过reading the documentation就无法做到这一点。

pw136qt2

pw136qt21#

我已经找到了一个方法...而且看起来很简单!
我意识到我可以得到一个空对象的序列化器几乎是免费的:

@Serializable
private object EmptyMap

现在,我可以直接编写一个自定义序列化程序:

object MyObjectSerializer : KSerializer<MyObject> {
    private val _delegate = MapSerializer(String.serializer(), EmptyMap.serializer())

    override val descriptor: SerialDescriptor = _delegate.descriptor

    override fun serialize(encoder: Encoder, value: MyObject) {
        val data = value.keys.associateWith { EmptyMap }
        encoder.encodeSerializableValue(_delegate, data)
    }

    override fun deserialize(decoder: Decoder): MyObject {
        val value = decoder.decodeSerializableValue(_delegate)
        return MyObject(value.keys)
    }

}

现在剩下要做的就是在类型上应用序列化器,可以使用以下命令完成:

@Serializer(with = MyObjectSerializer)
data class MyObject(val keys: Set<String>)

在示例上运行Json.encodeToString(example)可以完美地工作。

相关问题