Spring RestTemplate 和 JSON 如何忽略空数组反序列化?

Spring RestTemplate and JSON how to ignore empty Arrays deserialization?

我目前正在使用 Spring 4.1.6 和 RestTemplate 来使用带有 JSON 的第三方网络服务,我无法更改它 behavior.I 我正在使用 Jackson databind v2.6.0。

问题:有时服务returns为一个成员一个hashmap {member:{"key":"value",...} } 有时同一个成员只是一个空数组 {member:[]}。所以我不能默认忽略属性。

有没有办法配置反序列化以忽略空数组?我看到了一个 jackson 属性 "WRITE_EMPTY_JSON_ARRAYS" 但我不太确定如何将它与我的 restTemplate 和 spring 配置一起使用。

还有其他可能性吗?使用@JsonXXX 注释的某种组合?我看到可以在 class 级别上使用的 @JsonSerialize,但我不喜欢为我所有的 classes 编写反序列化程序来处理这种情况(但是,如果没有其他方法当然我会做的)

说明服务行为的响应示例:

我的 RestTemplate 用法示例:

    BasicAuthRequestFactory requestFactory = new BasicAuthRequestFactory(httpClient);        
    restTemplate = new RestTemplate(requestFactory);
    Article a = restTemplate.getForObject(new URI("http://..."), Article.class);

错误:

 caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token
 at [Source: java.io.PushbackInputStream@4aa21f9d; line: 1, column: 1456] (through reference chain: ResponseArticleWrapper["data"]->Article["categories"])
 at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)

我当前注释的例子class:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
public class Article {  
    @JsonProperty("id")
    private Integer id;
    @JsonProperty("categories")  
    private Map<Integer,String> categories = new HashMap<Integer,String>();
}

提前感谢您提供任何提示和示例。

自 jackson-databind 2.5 以来,有 DeserializationFeature 来处理这种情况。它默认关闭,因此您需要在 ObjectMapper:

中配置它
@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true);
    return objectMapper;
}

您可以在此处查看 RestTemplate 的自定义 ObjectMapper 是如何配置的:How can we configure the internal Jackson mapper when using RestTemplate?

完成配置后,您可以让 Spring 在您的 class:

中为您配置
@Autowired
private RestOperations restTemplate;

并使用提供的 restTemplate 实例。