2013-10-18 28 views
5

için seri hale getirme zamanından itibaren zaman kaybını kaybediyor Jackson'ı kullanarak bir Joda DateTime nesnesini serileştirmeye ve sonra yeniden serileştirmeye çalışıyorum, ancak nesneyi tamamen kaldırmıyor. Zaman dilimi bilgisi kaybolmuş gibi görünüyor.Jackson, JodaTime

Bu kod:

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new JodaModule()); 
mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS , false); 

DateTime dt = DateTime.now(); 
String j = mapper.writeValueAsString(dt); 
DateTime dt2 = mapper.readValue(j, DateTime.class); 

System.out.println("json: " + j); 
System.out.println("eq? " + (dt.equals(dt2))); 
System.out.println("dates:\n" + dt + "\n" + dt2); 

çıkışlar bu:

json: "2013-10-18T14:10:52.458-07:00" 
eq? false 
dates: 
2013-10-18T14:10:52.458-07:00 
2013-10-18T21:10:52.458Z 

bu tasarımdan mı? Burada yapabileceğim bir şey var mı? Bu konuda SO ile ilgili bir kaç soru gördüm, ancak bu konuyla ilgilenmeyen hiç bir şey yok.

Ben DateTime bir üst sınıf olan the Javadoc for AbstractInstant#equals() itibaren joda 2.1 ve Jackson 2.1

cevap

6

Evet, bu tasarım gereğidir. JodaTime DateTimeSerializer standart toString() yöntemini kullanır. JodaTime official guidetoString() uyarınca, DateTime için standart ISO8601 dizesi - döndürür. Ayrıca, standart DateTimeDeserializer her zaman UTC datetimes oluşturur.

TimeZone'u kaydetmek için, aynı jsonla ayrı olarak saklamanız ve seri hale getirme işleminden sonra .withZone() yöntemini kullanmanız veya sadece seri hale getirici ve serpme oluşturucu oluşturmanız gerekir.

GÜNCELLEME

Versiyon 2.2.3 biraz genişletilmiş davranışa sahip - DateTimeDeserializerDeserializationContext alınan saat dilimiyle DateTime oluşturur. ObjectMapper.setTimeZone() ile değiştirilebilir. Standart TimeZone.getTimeZone("GMT")

olduğunu
+1

Yani Joda nesneleri işlemek için ayrılmış tamamen ayrı bir modül var, ama mümkün olan en basit şekilde seri hale getirme, önemli bilgileri saklamak için başarısız ... Bu utanç verici. Görünüşe göre kendi desperizer'ımı yazmam gerekecek. – Vysarat

+2

Şikayet etmek yerine, gerçekten modülün yazarlarına başvurmayı denediniz mi? SO'da şikayet etmek OSS projeleri ile çalışmak için verimli bir yol değildir. – StaxMan

1

kullanıyorum:

milisaniye anlık dayalı eşitlik için belirtilen nesne ile bu nesneyi karşılaştırır kronoloji ve saat dilimi. (vurgularım)

Aynı anda aynı anıyı temsil eden ancak farklı saat dilimlerinde (zaman dilimi kimliğine göre) iki nesne farklı olarak kabul edilecektir. Aynı DateTimeZone, Chronology ve instant ile sadece iki nesne eşittir.

iki tarih aynı anlık tayin gösterir, ancak bunlar farklı saat dilimleri beri JodaTime onlar "eşit" olduğunu söylüyor. Jackson'ın onları nasıl idare ettiği konusunda yanlış bir şey göremiyorum.

+0

Doğru, eşit değiliz Yapmayı beklediğim zaman dilimi. – Vysarat

4
Jackson tarafından yerel bağlamın buna zaman dilimini ayarlamak değil söylenmelidir

: Jackson deserializing olmadığı için

mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); 

See this issue on GitHub