如何正确反序列化由包含另一个对象的列表项组成的 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 对象数组。
我正在使用的客户端 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 对象数组。