如何正确反序列化由包含另一个对象的列表项组成的 json?

How do I correctly deserialize json that consists of a list item that includes another object?

我正在使用的客户端 returns json 是这样的:

[
    {
        "source": "ANY"
    }
]

即对象所在数组的元素

我正在尝试提出这样的请求:

restTemplate.postForObject<AbcdResponse>(
    "/address",
    listOf(value).let { JsonHttpEntity(it) }
)
data class AbcdResponse(
    val obj: AbcdObject
)
data class DaDataAddress(
    val source: String?
)

但是我得到 HttpMessageNotReadableException 异常:

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.app.client.abcd.domain.AbcdResponse` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.app.client.abcd.domain.AbcdResponse` out of START_ARRAY token
 at [Source: (ByteArrayInputStream); line: 1, column: 1]

如何正确反序列化响应?

您可能已经注意到,响应 作为一个整体 是一个 JSON 数组。您可以通过围绕整个内容的方括号 [ ... ] 来判断。

正因为如此,你不能将它反序列化为一个对象(比如AbcdResponse)。你应该做的是使用 List<DaDataAddress> 而不是 AbcdResponse.

你真的不需要AbcdResponse。您需要的是在调用服务时按如下方式使用 ParameterizedTypeReference

restTemplate.exchange("/address", 
    HttpMethod.POST, 
    listOf(value).let { JsonHttpEntity(it) }, 
    ParameterizedTypeReference<List<DaDataAddress>>() {})

原因是您调用的服务正在返回 JSON 个 JSON 对象数组。