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列表:
- 编写自定义反序列化器:
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 } }
- 在控制器参数上指定使用该反序列化器:
@Post("/items") fun items( @Body @JsonDeserialize(using = PairListDeserializer::class) pairList: List<Pair<String, String>> ) { println(pairList) }
注意事项
- 方法1无需额外维护序列化代码,适合绝大多数场景。
- 方法2适合必须以
List<Pair>作为参数的场景,但需要自行维护反序列化逻辑。
内容的提问来源于stack exchange,提问作者sziolkow
相关产品推荐
相关产品推荐

