2012-11-23 25 views
8

我正在研究以下幾行代碼。找不到類型爲java.util.Date的Json反序列化器

val list = Car.getNames() 
Ok(Json.toJson(list)) 

我得到了以下錯誤....

[錯誤] my_app應用/應用/型號/ Car.scala:51:沒有Json的解串器發現java.util.Date類型。嘗試實現此類型的隱式讀取或格式。

Car具有java.util.date對象作爲參數之一,我實施讀取寫入支持java.util.date對象因爲import play.api.libs.json.*不支持它。

你能指出我的錯誤嗎?

implicit object CarFormat extends Format[Car] { 

    def reads(json: JsValue): Car = Car(
     (json \ "id").as[Long], 
     (json \ "height").as[Double], 
     (json \ "weight").as[Double], 
     (json \ "date").asOpt[java.util.Date] 
    ) 

    def writes(car: Car) = 
     JsObject(
      Seq(
       "id" -> JsString(car.id.toString), 
       "height" -> JsString(car.height.toString), 
       "weight" -> JsString(car.weight.toString), 
       "date" -> JsString(car.date.toString) 
      ) 
     ) 
} 
+0

我建議你不要使用java.util.Date - 使用更好的日期類,如喬達日期時間。這是https://github.com/jorgeortiz85/scala-time – Phil

+0

的一個Scala包裝我很抱歉遲到的迴應,並且我從你的評論中得到了準確的結果。謝謝:) – Masashi

回答

11

你只能定義爲FormatCar它需要一個java.util.DateFormat。試試這個:

import play.api.libs.json._ 

case class Car(id:Long, height:Double, weight:Double, date:Option[java.util.Date]) 

implicit object CarFormat extends Format[Car] { 

    implicit object DateFormat extends Format[java.util.Date] { 
    val format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 
    def reads(json:JsValue): java.util.Date = format.parse(json.as[String]) 
    def writes(date:java.util.Date) = JsString(format.format(date)) 
    } 

    def reads(json: JsValue): Car = Car(
    (json \ "id").as[Long], 
    (json \ "height").as[Double], 
    (json \ "weight").as[Double], 
    (json \ "date").asOpt[java.util.Date] 
) 

    def writes(car: Car) = 
    JsObject(
     Seq(
      "id" -> JsString(car.id.toString), 
      "height" -> JsString(car.height.toString), 
      "weight" -> JsString(car.weight.toString), 
      "date" -> JsString(car.date.toString) 
     ) 
    ) 
} 
+0

我很抱歉遲到的迴應,因爲我找不到這個收件箱,直到現在這是非常愚蠢的,但我非常感謝您的評論:) – Masashi

+0

我們是否將此代碼放入模型中?謝謝。 – mythicalprogrammer

+2

@mythicalprogrammer in scala,你可以把隱式定義放在任何地方,只要把它放到你需要它的地方。 – xiefei