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

