2012-11-22 28 views
2

我序列化使用Jerkson Json library含有Date(包裝器Jackson)的對象:斯卡拉/ Jerkson:指定日期的對象的格式以JSON

import com.codahale.jerkson.Json 
import java.util.Date 

case class JTest(
    val dTest: Date 
) 

val jt = new JTest(new Date()) 
println(Json.generate(jt)) 

這導致:

{"dTest":1353576079168} 

有什麼辦法可以指定格式或覆蓋生成函數嗎?

我意識到Json沒有適當的Date類型,所以輸出(以毫秒爲單位的unix時間)是「正確的」。我想讓我的日期序列化爲ISO 8601(帶時間/時區)格式的字符串:2007-04-05T01:12:22+0100,因爲它很容易解析並且可讀。 Date的toString吐出Thu Nov 22 10:27:54 CET 2012

+0

看一看http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html至今轉換成所需格式的字符串。 – Salil

回答

1

這裏有兩個問題。首先,ISO8601日期的小問題 - 這些都可以使用SimpleDateFormat實現,例如,

import java.text._ 
import java.util._ 
val d1 = new Date() 
val sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") 
println(sdf.format(d1)) 

格式化程序將解析以及格式。切記不要在線程之間共享它(因爲它不是線程安全的,所以在使用之前總是在本地作用域中創建一個實例)。其次,在Jerkson中自動使用日期更棘手的問題。這似乎是Jerkson的一個特徵,比Lift-json差。後者允許將自定義分析器/格式化程序代碼插入解析層。 Jerkson沒有,我想。

我們忽略了這個限制。我們喜歡Jerkson的卓越性能,所以我們只是使用Long和String來進行日期傳輸,並且我們分別處理解析。例如

case class JTest(val dTest: String) { 
    lazy val dTestDate: Date = { 
    val sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") 
    sdf.parse(dTest) 
    } 
} 
+0

聰明的解決方法,但是,它會爲我創建一些其他問題。我的模型也被用作db schema(squeryl),並且這些字段必須是「Date」才能正確映射。我發現Jerkson支持「@transient」註釋,它從json中省略。 Squeryl支持「@Transient」,它堅持不懈。如果我能找到一種方法來重命名vals(當映射到json時),我可以做一個「透明」的解決方法。 – Joernsn

+1

上面沒有提到的'other'解決方法是編寫case類對。一個版本支持Jerkson和其他Squeryl(或任何其他用法)。後者可以使用適配器'apply()'方法從前者構建,反之亦然。這需要兩倍的代碼,但允許將Jerkson版本視爲短期數據傳輸對象。 –

+0

我喜歡這個想法,我會嘗試一下。我會繼續尋找一種「適當」的方式,但我不太樂觀,所以我最終可能會遇到一個或多個解決方法。感謝您的建議,請讓我知道,如果你想出點什麼! – Joernsn