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

Kotlin中如何将JSON映射结构转换为Pair列表并验证?

解决JSON对象转List<Pair<String, String>>的问题

错误原因

你提交的JSON是顶层对象结构(键值对集合),但控制器参数声明为List<Pair<String,String>>时,序列化框架(如Jackson)会默认期望输入是JSON数组,数组内每个元素需包含first和second字段(例如[{"first":"a","second":"b"},{"first":"b","second":"c"}])。两者结构不匹配,导致反序列化失败。

解决方案

方法1:先接收为Map,再转换为Pair列表

这是最简洁的方案,保留原有能正常工作的Map参数,手动将其转换为List<Pair>:

@Post("/items")
fun items(@Body myMap: Map<String, String>) {
    val pairList = myMap.map { (key, value) -> Pair(key, value) }
    println(pairList)
}

方法2:自定义JSON反序列化器(直接接收List)

如果必须让控制器直接接收List<Pair<String,String>>,可以自定义反序列化逻辑,告诉框架如何将JSON对象转换为Pair列表:

  1. 编写自定义反序列化器:
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext
import com.fasterxml.jackson.databind.JsonDeserializer
import com.fasterxml.jackson.databind.JsonNode
import kotlin.Pair

class PairListDeserializer : JsonDeserializer<List<Pair<String, String>>>() {
    override fun deserialize(parser: JsonParser, context: DeserializationContext): List<Pair<String, String>> {
        val jsonNode: JsonNode = parser.codec.readTree(parser)
        val pairList = mutableListOf<Pair<String, String>>()
        jsonNode.fields().forEach { entry ->
            pairList.add(Pair(entry.key, entry.value.asText()))
        }
        return pairList
    }
}
  1. 在控制器参数上指定使用该反序列化器:
@Post("/items")
fun items(
    @Body @JsonDeserialize(using = PairListDeserializer::class)
    pairList: List<Pair<String, String>>
) {
    println(pairList)
}

注意事项

  • 方法1无需额外维护序列化代码,适合绝大多数场景。
  • 方法2适合必须以List<Pair>作为参数的场景,但需要自行维护反序列化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:24:22