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

