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 编写反序列化程序来处理这种情况(但是,如果没有其他方法当然我会做的)
说明服务行为的响应示例:
用哈希图响应
{"id":170,"categories":{"13":"caro"}}
响应相同成员的空数组
{"id":170,"categories":[]}
我的 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
实例。
我目前正在使用 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 编写反序列化程序来处理这种情况(但是,如果没有其他方法当然我会做的)
说明服务行为的响应示例:
用哈希图响应 {"id":170,"categories":{"13":"caro"}}
响应相同成员的空数组 {"id":170,"categories":[]}
我的 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
实例。