3

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

02-25 14:46:04.035:E/AndroidRuntime(12271):org.springframework.http.converter.HttpMessageNotReadableException:无法读取 JSON:无法从字符串值“-3600”构造 java.util.Date 的实例:不是有效的表示(错误:无法解析日期值'-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"))

我如何设置杰克逊忽略不可读/可解析的值?我宁愿有 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 值之前,我的解析器工作正常,所以没有问题。

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

4

1 回答 1

-1

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

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

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

于 2015-03-17T13:54:18.213 回答