Jackson - 将 JSON 反序列化为类

2024-02-12

我正在调用一个返回 JSON 的端点,看起来像这样(在 Postman 中):

{
    "Result": {
        "attribute1": { ... },
        "attribute2": { ... }
    }
}

该请求返回的Content-Type标头是text/x-json(与通常的application/json)。我认为这在尝试通过杰克逊反序列化时会引起一些问题。该 JSON 的 POJO 看起来像这样:

@Getter
@Setter
public class Response {

    @JsonProperty("Result")
    private Result result;

}

The Result类来自外部库(编写此端点的人是同一个人)。无论哪种方式,当我尝试通过调用此端点时RestTemplate.exchange(),Jackson 无法将此 JSON 反序列化为有效的Result班级。我正在这样做:

ResponseEntity<Response> response = restTemplate.exchange(url, HttpMethod.GET, null, Response.class);

Doing response.getBody()给出一个Response包含 null 的对象Result目的。显然,Jackson 没有正确反序列化 JSON。我怀疑这是因为不寻常text/x-jsonAPI 返回的 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绑定到:

  • 应用程序/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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jackson - 将 JSON 反序列化为类 的相关文章

随机推荐