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

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,就自定义反序列化逻辑来解析这个畸形字符串:

  1. 写一个自定义反序列化器,负责把错误格式的字符串转成列表
  2. 在数据类的对应字段上标注使用这个反序列化器

自定义反序列化器代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:07:17