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反序列化逻辑:
- 实现自定义反序列化器:
class ArrayDataClassDeserializer : JsonDeserializer<ArrayDataClass>() { override fun deserialize(p: JsonParser, ctxt: DeserializationContext): ArrayDataClass { val itemList = p.readValueAs<List<Item>>() return ArrayDataClass(SomeData(itemList)) } }
- 在目标数据类上指定该反序列化器:
@JsonDeserialize(using = ArrayDataClassDeserializer::class) data class ArrayDataClass(val data: SomeData)
- 直接用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
相关产品推荐
相关产品推荐

