Jackson-将JSON反序列化为类

时间:2019-03-21 17:20:35

标签: java json spring jackson deserialization

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

Mask

此请求返回的Content-Type标头为{ "Result": { "attribute1": { ... }, "attribute2": { ... } } } (与通常的text/x-json相反)。我认为这在尝试通过Jackson进行反序列化时会引起一些问题。 JSON的POJO看起来像这样:

application/json

@Getter @Setter public class Response { @JsonProperty("Result") private Result result; } 类来自外部库(编写此终结点的人相同)。无论哪种方式,当我尝试通过Result调用此终结点时,Jackson都无法将该JSON反序列化为有效的RestTemplate.exchange()类。我正在这样做:

Result

执行ResponseEntity<Response> response = restTemplate.exchange(url, HttpMethod.GET, null, Response.class); 会得到一个response.getBody()对象,其中包含一个空Response对象。显然,Jackson没有正确反序列化JSON。我怀疑这是由于API返回的异常Result Content-Type。

我也将text/x-json对象配置为能够解析MappingJackson2HttpMessageConverter内容类型,但没有运气:

text/x-json

有指针吗?

更新:我不知道为什么它不起作用,但是我想出了另一种方法-以MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("text", "x-json"))); restTemplate.getMessageConverters().add(jsonConverter); 而不是域对象的形式获取JSON,这足以满足我的目的。

1 个答案:

答案 0 :(得分:3)

默认情况下,MappingJackson2HttpMessageConverter绑定到:

  • application / json
  • application / * + 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);