如何用Kotlinx-serialization实现无引号序列化原始字符串?
用Kotlin Serialization实现类似Jackson @JsonRawValue的效果
要实现字符串值无引号序列化(直接输出原始JSON内容),你可以通过自定义序列化器来实现,核心思路是利用JsonLiteral标记内容为非字符串类型,让编码器直接输出原始值。
步骤1:编写自定义序列化器
创建一个KSerializer实现,序列化时将字符串包装为JsonLiteral并设置isString = false,反序列化时直接读取原始JSON内容:
import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.JsonDecoder import kotlinx.serialization.json.JsonEncoder import kotlinx.serialization.json.JsonLiteral object RawStringSerializer : KSerializer<String> { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("RawString", PrimitiveKind.STRING) override fun serialize(encoder: Encoder, value: String) { // 仅支持JSON编码器,直接写入原始内容 val jsonEncoder = encoder as? JsonEncoder ?: error("RawStringSerializer only works with JSON serialization") jsonEncoder.encodeJsonElement(JsonLiteral(value, isString = false)) } override fun deserialize(decoder: Decoder): String { // 反序列化时直接读取整个JSON元素转为字符串 return if (decoder is JsonDecoder) { decoder.decodeJsonElement().toString() } else { decoder.decodeString() } } }
步骤2:在数据类中使用序列化器
通过@Serializable(with = ...)注解将自定义序列化器绑定到目标字段:
import kotlinx.serialization.Serializable @Serializable data class SomeData( @Serializable(with = RawStringSerializer::class) val value: String )
步骤3:测试效果
序列化时会直接输出原始JSON内容,不会给字符串加引号:
import kotlinx.serialization.json.Json fun main() { val data = SomeData("{}") val json = Json.encodeToString(data) println(json) // 输出: {"value":{}} }
适配你的需求
这个方案完全符合你的场景:从接口获取原始JSON字符串存入数据库,加载返回时直接输出原始内容,全程不需要解析JSON结构,避免多余计算和内容篡改。
内容的提问来源于stack exchange,提问作者Karsten Gabriel
相关产品推荐
相关产品推荐

