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

Spring Kotlin中如何用RestTemplate解析响应中的JSON数组

Spring Kotlin中RestTemplate解析JSON数组响应到自定义数据类的解决方案

方法一:手动包装列表到目标数据类

由于响应直接是[{foo:1}, {foo:2}]格式的数组,可先将其解析为List<Item>,再手动封装到你定义的SomeData和ArrayDataClass中:

// 基础数据类定义
data class Item(val foo: Int)
data class SomeData(val items: List<Item>)
data class ArrayDataClass(val data: SomeData)

// 使用exchange方法,通过ParameterizedTypeReference指定泛型列表类型
val response = restTemplate.exchange(
    url,
    HttpMethod.POST,
    HttpEntity(request),
    object : ParameterizedTypeReference<List<Item>>() {}
)

// 手动封装成目标数据类
val arrayData = ArrayDataClass(SomeData(response.body ?: emptyList()))

方法二:自定义Jackson反序列化器

若希望RestTemplate直接将JSON数组反序列化为ArrayDataClass,可自定义Jackson反序列化逻辑:

  1. 实现自定义反序列化器:
class ArrayDataClassDeserializer : JsonDeserializer<ArrayDataClass>() {
    override fun deserialize(p: JsonParser, ctxt: DeserializationContext): ArrayDataClass {
        val itemList = p.readValueAs<List<Item>>()
        return ArrayDataClass(SomeData(itemList))
    }
}
  1. 在目标数据类上指定该反序列化器:
@JsonDeserialize(using = ArrayDataClassDeserializer::class)
data class ArrayDataClass(val data: SomeData)
  1. 直接用RestTemplate解析:
val response = restTemplate.postForEntity(
    url,
    request,
    ArrayDataClass::class.java
)

方法三:用ObjectMapper手动处理响应体

如果不想修改RestTemplate配置,可先获取原始响应字符串,再通过ObjectMapper完成解析:

val rawResponse = restTemplate.postForObject(url, request, String::class.java)
val itemList = ObjectMapper().readValue(rawResponse, object : TypeReference<List<Item>>() {})
val arrayData = ArrayDataClass(SomeData(itemList))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:03:23