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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:15:34