【问题标题】:No Json deserializer found for type java.util.Date找不到类型 java.util.Date 的 Json 反序列化器
【发布时间】:2012-11-23 21:54:26
【问题描述】:

我正在编写以下代码行。

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

我收到以下错误....

[错误] my_app/app/models/Car.scala:51: 找不到 java.util.Date 类型的 Json 反序列化器。尝试为此类型实现隐式读取或格式化。

Carjava.util.date 对象作为参数之一,我实现了 ReadsWrites 以支持 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)
            )   
        )   
}   

【问题讨论】:

  • 我建议您不要使用 java.util.Date - 使用更好的日期类,例如 Joda Date Time。这是github.com/jorgeortiz85/scala-time 的 Scala 包装器
  • 对于迟到的回复感到抱歉,我从您的评论中得到了我想要的确切结果。谢谢你:)

标签: scala playframework


【解决方案1】:

您只为Car 定义了Format,但它需要为java.util.Date 定义Format。试试这个:

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)
        )   
    )   
}   

【讨论】:

  • 对于迟到的回复感到抱歉,因为我直到现在才找到这个收件箱,这很愚蠢,但我非常感谢您的评论 :)
  • @mythicalprogrammer in scala,你可以把隐式定义放在任何地方,只要把它带到你需要的范围内。
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多