2016-01-13 24 views
3

我在我正在使用的服务的反序列化过程中使用的类中有以下字段。ZonedDateTime的杰克逊反序列化问题

private ZonedDateTime transactionDateTime; 

我消耗可能返回日期或日期时间使用模式的服务:yyyy-MM-dd'T'HH:mm:ss.SSSZ

让我给的服务回报什么的2个例子:

  • 2015-11-18T18 :05:38.000 + 0200
  • 2015-11-18T00:00:00.000 + 0200

虽然第一个运作良好,后者会导致反序列化过程中被抛出以下异常:

java.time.format.DateTimeParseException:文本 “2015-11-18T00:00:00.000 + 0200”无法解析at index 23

我正在使用;

  • 春季启动1.3.1
  • 杰克逊2.6.4(与JSR310模块包括)

这是否需要自定义反序列化类?

回答

1

在我用的是场@JsonFormat注解,但是删除了,因为我认为这是针对系列化只喜欢JavaDoc中建议的代码早。

原来,我需要加回注释。而真正的问题是第三方服务响应确实是错误的(它缺少XML中的包装器元素),导致反序列化失败。错误是:

com.fasterxml.jackson.databind.JsonMappingException:可以键入的不 实例化值的简单类型,类 com.foo.bar.adapter.john.model.account.UserAccount] 来自字符串值('2015-11-18T00:00:00.000 + 0200');无单串 构造函数/工厂方法

领域是这样写如下:

@JsonFormat(pattern = Constants.DATETIME_FORMAT) 
@JacksonXmlProperty(localName = "transactionDate") 
private ZonedDateTime transactionDateTime; 

而且我有,因为对象是封装在一个集合添加@JsonRootName("transaction")到类这一领域的。

+0

你能分享这个模式吗? 'Constants.DATETIME_FORMAT' – ehsun7b

+0

yyyy-MM-dd'T'HH:mm:ss.SSSZ – tunix

+0

谢谢,但这并不适用于我,最终我通过为ZonedDateTime类编写自定义序列化器和反序列化器来解决我的问题。 – ehsun7b

1

您可以使用诸如注释:

@JsonSerialize(using = MyCustomJsonDateSerializer.class) 

@JsonDeserialize(using = MyCustomJsonDateDeserializer.class) 

要定制杰克逊如何解析日期。那些自定义串行器和解串器必须扩展JsonSerializer和JsonDeserializer。例如:

public class MyCustomJsonDateSerializer extends JsonSerializer<Date> { 

    @Override 
    public void serialize(Date date, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
     jgen.writeString(date != null ? ISODateTimeFormat.dateTime().print(new DateTime(date)) : null); 
     } 
}