我使用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值之前我的解析器工作正常,所以没有问题。
有没有办法忽略这些错误?
答案 0 :(得分:0)
ObjectMapper
上有一个名为WRITE_DATES_AS_TIMESTAMPS
的设置。这会导致日期序列化为long而不是字符串,因此禁用它以获取字符串。你绝对应该读到这个:http://wiki.fasterxml.com/JacksonFAQDateHandling
如果您不想这样做,要忽略基于某些逻辑的字段,只需为日期字段添加一个设置器,需要很长时间并自行解析。您可能需要使用@JsonSetter("expiration_date")
对其进行注释,以便杰克逊知道将其传递到那里。
最后,Java日期/日历API通常被认为是完全可怕的,应该尽可能避免。如果您使用的是Java 8,那么新的日期/时间api要好得多。如果您是Java 8之前的版本,请使用JodaTime。甚至还有一个特殊的杰克逊模块来处理它。