2016-01-13 49 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); 
     } 
}