Kotlin中Jackson反序列化List<String>字段报错求助
问题分析与解决办法
问题根源
你的源JSON字符串里old_user_ids字段格式完全错误:它被当成字符串包裹,而且内部引号嵌套混乱,变成了"[\"id1,id2,id3\"]"这种非法格式。Jackson试图把这个字符串直接转成List<String>,但没有默认逻辑支持从字符串转ArrayList,所以抛出了错误。
解决办法
方案1:修正源JSON格式(优先推荐)
如果能控制生成JSON的源头,直接把old_user_ids改成合法的JSON数组格式:
val myList = """{"user_id": "id1" ,"old_user_ids": ["id1","id2","id3"], "status":"ACTIVE"}"""
这样Jackson可以直接正常反序列化,不需要额外处理。
方案2:兼容错误格式的自定义反序列化
如果没法修改源JSON,就自定义反序列化逻辑来解析这个畸形字符串:
- 写一个自定义反序列化器,负责把错误格式的字符串转成列表
- 在数据类的对应字段上标注使用这个反序列化器
自定义反序列化器代码
class StringToListDeserializer : StdDeserializer<List<String>>(List::class.java) { override fun deserialize(p: JsonParser, ctxt: DeserializationContext): List<String> { val rawStr = p.text // 清理掉多余的引号、方括号,再按逗号分割 val cleanedStr = rawStr.replace(Regex("^\"|\"$"), "") .replace(Regex("^\\[|]$"), "") return if (cleanedStr.isBlank()) emptyList() else cleanedStr.split(",") } }
修改数据类
import com.fasterxml.jackson.databind.annotation.JsonDeserialize data class UserRecord( var user_id: String = "", @JsonDeserialize(using = StringToListDeserializer::class) var old_user_ids: List<String> = emptyList(), var status: String = "" )
验证结果
不管用哪种方案,最终反序列化得到的UserRecord对象,再序列化成JSON都会和你期望的一致:
{ "user_id": "id1", "old_user_ids": ["id1","id2","id3"], "status":"ACTIVE" }
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

