如何用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
相关产品推荐
相关产品推荐

