我正在调用一个返回 JSON 的端点,它看起来像这样(在 Postman 中):
{
"Result": {
"attribute1": { ... },
"attribute2": { ... }
}
}
此请求返回的 Content-Type header 是 text/x-json
(与通常的 application/json
相对)。我认为这在尝试通过 Jackson 反序列化时会导致一些问题。这个 JSON 的 POJO 看起来像这样:
@Getter
@Setter
public class Response {
@JsonProperty("Result")
private Result result;
}
Result
类来自外部库(与编写此端点的人员相同)。无论哪种方式,当我尝试通过 RestTemplate.exchange()
调用此端点时,Jackson 都无法将此 JSON 反序列化为有效的 Result
类。我这样做:
ResponseEntity<Response> response = restTemplate.exchange(url, HttpMethod.GET, null, Response.class);
执行 response.getBody()
会得到一个 Response
对象,其中包含一个空的 Result
对象。显然,Jackson 没有正确反序列化 JSON。我怀疑这是因为 API 返回的异常 text/x-json
Content-Type。
我还有我的 MappingJackson2HttpMessageConverter
对象配置为能够解析 text/x-json
内容类型,但运气不好:
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("text", "x-json")));
restTemplate.getMessageConverters().add(jsonConverter);
有什么建议吗?
更新:我不知道为什么这不起作用,但我找到了另一种方法 - 将 JSON 作为 Map
而不是域对象获取,这对我的目的来说已经足够好了.
最佳答案
默认 MappingJackson2HttpMessageConverter
绑定(bind)到:
- 应用程序/json
- 应用/*+json
我们需要添加text/x-json
。
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
List<MediaType> jsonTypes = new ArrayList<>(jsonConverter.getSupportedMediaTypes());
jsonTypes.add(new MediaType("text", "x-json"));
jsonConverter.setSupportedMediaTypes(jsonTypes);
现在,我们应该在 RestTemplate
中使用它:
restTemplate.setMessageConverters(Collections.singletonList(jsonConverter));
ResponseEntity<RequestPayload> response = restTemplate.exchange(url, HttpMethod.GET, null, RequestPayload.class);
关于java - Jackson - 将 JSON 反序列化为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55285941/