You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Kotlin序列化将含Set<String>的类转为值为空对象的JSON?

实现Kotlin Serialization自定义序列化方案

要实现你需要的JSON格式,只需编写一个符合要求的自定义序列化器,直接控制JSON的生成逻辑即可:

1. 自定义序列化器实现

import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonEncoder
import kotlinx.serialization.json.buildJsonObject

object CustomSerializer : KSerializer<MyObject> {
    override val descriptor: SerialDescriptor = buildClassSerialDescriptor("MyObject")

    override fun serialize(encoder: Encoder, value: MyObject) {
        // 转换为JSON编码器,构建目标格式的JSON结构
        val jsonEncoder = encoder as JsonEncoder
        val targetJson = buildJsonObject {
            value.keys.forEach { key ->
                put(key, buildJsonObject {}) // 每个键对应空JSON对象
            }
        }
        jsonEncoder.encodeJsonElement(targetJson)
    }

    override fun deserialize(decoder: Decoder): MyObject {
        // 可选:如果需要从目标JSON反序列化为MyObject
        val jsonDecoder = decoder as kotlinx.serialization.json.JsonDecoder
        val jsonObject = jsonDecoder.decodeJsonElement().jsonObject
        return MyObject(jsonObject.keys.toSet())
    }
}

2. 使用示例

import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

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

fun main() {
    val example = MyObject(setOf("abc", "def"))
    val json = Json.encodeToString(example)
    println(json) // 输出结果:{"abc":{},"def":{}}
}

关键说明

  • 序列化时通过buildJsonObject直接构造API要求的结构,遍历keys集合为每个元素生成键值对,值固定为空JSON对象。
  • 反序列化方法为可选实现,如果不需要将目标JSON转回MyObject,可以省略或留空(但序列化器接口要求必须实现,可根据需求调整)。

内容的提问来源于stack exchange,提问作者Renato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:35:24