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

Kotlinx.Serialization用encodeToJsonElement序列化Any类型遇序列化器未找到错误

解决Any类型序列化问题

问题原因

调用json.encodeToJsonElement(data)且data为Any类型时,Kotlin序列化框架无法自动推断实际对象的序列化器。即便在SerializersModule中注册了Any的自定义序列化器,也会因泛型类型擦除和默认查找逻辑限制,抛出找不到Any序列化器的异常。

解决方案

方案1:动态获取实际类型的序列化器

直接根据对象实际类型获取对应序列化器,无需依赖Any的自定义序列化器:

修改f函数如下:

fun f(data: Any) {
    // 获取对象实际类型的序列化器
    val actualSerializer = data::class.serializer()
    // 传入序列化器完成序列化
    val d = json.encodeToJsonElement(actualSerializer, data)
    println(d) // 输出示例: {"name":"jack"}
}

方案2:显式使用自定义序列化器

若需保留DynamicLookupSerializer,调用时需显式指定该序列化器:

fun f(data: Any) {
    val d = json.encodeToJsonElement(DynamicLookupSerializer, data)
    println(d) // 输出示例: {"name":"jack"}
}

完整可运行代码

以下是方案1的精简代码,无需自定义DynamicLookupSerializer:

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.encodeToJsonElement
import kotlinx.serialization.serializer

@Serializable
data class Person(
    val name: String
)

private val json = Json {}

fun main() {
    f(Person("jack"))
}

fun f(data: Any) {
    val actualSerializer = data::class.serializer()
    val d = json.encodeToJsonElement(actualSerializer, data)
    println(d)
}

若需支持更多特殊类型,可添加兜底逻辑:

fun f(data: Any) {
    val actualSerializer = json.serializersModule.getContextual(data::class) 
        ?: data::class.serializer()
    val d = json.encodeToJsonElement(actualSerializer as KSerializer<Any>, data)
    println(d)
}

关键说明

  • Kotlin序列化要求被序列化的类必须标记@Serializable注解,或提供自定义KSerializer实现。
  • 处理Any类型对象时,必须显式获取其实际类型的序列化器,框架无法自动推断泛型为Any时的具体序列化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:37:51