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

Kotlin中如何将Any类型对象转换为指定的自定义类类型

方案1:直接解析toString输出(无额外依赖,最轻量)

你拿到的对象toString格式是固定的key=value用逗号分隔的结构,直接匹配type字段的值即可,不需要引入任何序列化框架:

fun getTypeFromAny(obj: Any): String? {
    val objStr = obj.toString()
    // 匹配type=后面到下一个逗号或闭合大括号前的内容
    val typeRegex = Regex("""type\s*=\s*([^,}]+)""")
    return typeRegex.find(objStr)?.groupValues?.get(1)?.trim()
}

// 直接使用
val type = getTypeFromAny(myObject)
// 要转UserType的话直接构造即可
val userType = UserType(type = type ?: return)

适用场景:确认该对象的toString格式稳定,不会出现字段值里嵌套包含type=的特殊场景。


方案2:反射获取字段值(更稳定,不依赖toString格式)

如果不确定toString格式会不会变动,直接用JVM反射读取该对象的type属性值,性能和稳定性都更高:

fun getTypeByReflect(obj: Any): String? {
    return try {
        val field = obj::class.java.getDeclaredField("type")
        // 关闭访问权限检查就算是private字段也能读
        field.isAccessible = true
        field.get(obj) as? String
    } catch (e: NoSuchFieldException) {
        null
    } catch (e: IllegalAccessException) {
        null
    }
}

// 使用
val type = getTypeByReflect(myObject)
val userType = UserType(type = type ?: return)

如果项目已经引入Kotlin反射依赖,写法可以更简洁:

fun getTypeByKtReflect(obj: Any): String? {
    return obj::class.memberProperties
        .firstOrNull { it.name == "type" }
        ?.apply { isAccessible = true }
        ?.get(obj) as? String
}

之前操作报错的原因

  • kotlinx-serialization的encodeToString只能序列化标记了@Serializable注解的类,你拿到的第三方Any对象没有对应注解,自然无法序列化为JSON
  • decodeFromString要求输入是标准JSON格式字符串,你传入的是Any对象本身,且该对象的toString也不是标准JSON结构,所以会抛出格式错误异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:54:04