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

Kotlin使用kotlinx.serialization动态指定类型解析JSON求助

解决kotlinx.serialization解析JSON到指定KClass的问题

先梳理你代码里的几个问题

  • 你写了Json.encodeToString(jstr),但jstr已经是JSON字符串,这一步完全多余,直接用jstr作为解析输入即可。
  • Json.decodeFromString<targetClass>写法错误,泛型参数需要传入具体类型而非KClass实例,kotlinx.serialization提供了接收序列化器的重载方法来解决这个问题。
  • 你的when表达式里多了个逗号,属于语法错误。

方案1:通用版(支持所有可序列化类)

如果目标是支持任何被@Serializable注解的类,不需要写when判断,直接通过KClass的serializer()方法获取序列化器即可:

import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json

// 假设jstr是当前类的成员变量,类型为String
fun <T : Any> toObject(targetClass: KClass<T>): T {
    return Json.decodeFromString(targetClass.serializer(), jstr)
}

方案2:限制只支持特定类(对应你原有的when逻辑)

如果你只想让方法处理指定的几个类,修正后的代码如下:

import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json

@Serializable
data class TargetClass(/* 你的类成员变量 */)

// 假设jstr是当前类的成员变量,类型为String
fun <T : Any> toObject(targetClass: KClass<T>): T {
    return when (targetClass) {
        TargetClass::class -> Json.decodeFromString<TargetClass>(jstr)
        // 可继续添加其他支持的类
        // AnotherTarget::class -> Json.decodeFromString<AnotherTarget>(jstr)
        else -> throw IllegalArgumentException("不支持的类类型:${targetClass.simpleName}")
    } as T // 此处强转安全,因为when分支返回的都是T的子类
}

额外注意事项

  • 确保要解析的类都添加了@Serializable注解,否则kotlinx.serialization无法生成对应的序列化器。
  • 如果jstr不是类成员变量,记得把它作为参数添加到toObject方法中。
  • 方案1的写法更通用,无需每次新增类都修改方法逻辑,推荐优先使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:37:10