2012-11-23 30 views
8

Tôi đang làm việc trên các dòng mã sau đây.Không tìm thấy Json deserializer cho loại java.util.Date

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

tôi có các lỗi sau đây ....

[lỗi] my_app/app/mô hình/Car.scala: 51: Không Json deserializer tìm thấy cho loại java.util.Date. Hãy thử triển khai Đọc hoặc Định dạng ngầm cho loại này.

Car có đối tượng java.util.date là một trong những thông số và tôi thực hiện các ĐọcViết để hỗ trợ các đối tượng java.util.date từ import play.api.libs.json.* không hỗ trợ nó.

Bạn có chỉ ra sai lầm của mình không?

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

Tôi khuyên bạn không nên sử dụng java.util.Date - sử dụng lớp ngày tốt hơn như Ngày giờ Joda. Đây là một trình bao bọc Scala cho https://github.com/jorgeortiz85/scala-time – Phil

+0

Tôi xin lỗi về phản hồi trễ và tôi nhận được kết quả chính xác những gì tôi muốn từ nhận xét của bạn. Cảm ơn bạn :) – Masashi

Trả lời

11

Bạn chỉ được xác định Format cho Car nhưng nó đòi hỏi một Format cho java.util.Date. Hãy thử điều này:

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

Tôi xin lỗi về phản hồi muộn vì tôi không thể tìm thấy hộp thư đến này cho đến bây giờ mà là rất ngu ngốc nhưng tôi rất cảm ơn bạn đã bình luận của bạn :) – Masashi

+0

Chúng tôi đặt mã này trong mô hình? Cảm ơn. – mythicalprogrammer

+2

@mythicalprogrammer trong scala, bạn có thể đặt định nghĩa ngầm ở bất cứ nơi nào, chỉ cần mang nó đến phạm vi mà bạn cần nó. – xiefei

Các vấn đề liên quan