使用spring忽略Jackson中的无效值

时间:2013-02-25 16:11:06

标签: android json spring date jackson

我使用Spring框架从GET请求接收JSON。一切都运行得很好,直到在数据库中放入错误的值并发生这种情况:

  

02-25 14:46:04.035:E / AndroidRuntime(12271):   org.springframework.http.converter.HttpMessageNotReadableException:   无法读取JSON:无法构造java.util.Date的实例   字符串值'-3600':不是有效表示(错误:失败   解析日期值'-3600':无法解析日期“-3600”:不兼容   任何标准形式(“yyyy-MM-dd'T'HH:mm:ss.SSSZ”,   “yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”,“EEE,dd MMM yyyy HH:mm:ss zzz”,   “YYYY-MM-DD”))

如何设置Jackson忽略不可读/可解析的值?我宁愿null或者说我的完整json解析失败...

这是我尝试解析的对象,正如您所见,我试图在代码中忽略jsonignoreproperties的属性。

收据:

public class Receipt {

    public String categories;


    @JsonProperty("expiration_date")
    public Date expirationDate;

    public String image1;

    public String image2;
(..  more properties, getters and setters ..)

我是如何尝试解析的:

RestTemplate restTemplate = new RestTemplate();


    // instellen dat de converter ongedefineerde parameters negeert
    HttpMessageConverter customconver = new MappingJackson2HttpMessageConverter();
    ((MappingJackson2HttpMessageConverter) customconver).getObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //here the ignore unknown

    restTemplate.getMessageConverters().add(customconver);
    restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
    try {
    // GET Request
    ResponseEntity<ReceiptMessage> response = restTemplate.exchange(urlPath, HttpMethod.GET,requestEntity,ReceiptMessage.class);

请记住,在-3600值之前我的解析器工作正常,所以没有问题。

有没有办法忽略这些错误?

1 个答案:

答案 0 :(得分:0)

ObjectMapper上有一个名为WRITE_DATES_AS_TIMESTAMPS的设置。这会导致日期序列化为long而不是字符串,因此禁用它以获取字符串。你绝对应该读到这个:http://wiki.fasterxml.com/JacksonFAQDateHandling

如果您不想这样做,要忽略基于某些逻辑的字段,只需为日期字段添加一个设置器,需要很长时间并自行解析。您可能需要使用@JsonSetter("expiration_date")对其进行注释,以便杰克逊知道将其传递到那里。

最后,Java日期/日历API通常被认为是完全可怕的,应该尽可能避免。如果您使用的是Java 8,那么新的日期/时间api要好得多。如果您是Java 8之前的版本,请使用JodaTime。甚至还有一个特殊的杰克逊模块来处理它。