2015-07-16 15 views
9

Tôi đang phát triển một ứng dụng Play và tôi đang cố gắng sử dụng đối tượng DateTime Joda vào lớp chữ của tôi.Cách sử dụng Joda DateTime với Play Json

package model 

import org.joda.time.DateTime 
import play.api.libs.json._ 

case class User(name: String, created: DateTime) 

object User { 
    implicit val yourJodaDateReads = Reads.jodaDateReads("yyyy-MM-dd'T'HH:mm:ss.SSSZ") 
    implicit val yourJodaDateWrites = Writes.jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss.SSSZ'") 
    implicit val userFormat = Json.format[User] 

    def main(args: Array[String]) { 

    val value = Json.parse("{ \"name\" : \"hello\" , \"created\" : \"2015-07-16T20:32:04.046+02:00\" }") 

    println(Json.toJson(new User("user", new DateTime()))) 
    println(Json.fromJson(value)) 
} 
} 

Dựa trên solution này, tôi nhận được lỗi này:

Error:(18, -1) Play 2 Compiler: 
/activator-1.3.2/notifier-app/app/model/Test.scala:18: ambiguous implicit values: 
both value yourJodaDateReads in object User of type => play.api.libs.json.Reads[org.joda.time.DateTime] 
    and value userFormat in object User of type => play.api.libs.json.OFormat[model.User] 

Tôi đang sử dụng Activator 1.3.2 and Play 2.3.8.

Bạn có thể tư vấn cho tôi không?

Xin cảm ơn trước.

cập nhật

Tôi hiểu có sự mâu thuẫn với giá trị tiềm ẩn trong play.api.libs.json.Reads

implicit val DefaultJodaDateReads = jodaDateReads("yyyy-MM-dd") 

Làm thế nào tôi có thể giải quyết vấn đề này?

+0

có thể trùng lặp của [Bộ nối tiếp Joda tùy chỉnh bằng cách sử dụng thư viện JSON của Khung chơi?] (Http: // stackoverflow.com/questions/18255504/custom-jodatime-serializer-sử dụng-play-framework-json-library) –

+0

Vui lòng đọc bài đăng của tôi thay vì trả lời một câu trả lời không tốt. Tôi đã trích dẫn liên kết này vì mã của tôi dựa trên chủ đề này .. – Guillaume

Trả lời

17

Mong một lựa chọn tốt hơn, đây workaround của tôi:

val dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 

val jodaDateReads = Reads[DateTime](js => 
    js.validate[String].map[DateTime](dtString => 
    DateTime.parse(dtString, DateTimeFormat.forPattern(dateFormat)) 
) 
) 

val jodaDateWrites: Writes[DateTime] = new Writes[DateTime] { 
    def writes(d: DateTime): JsValue = JsString(d.toString()) 
} 

val userReads: Reads[User] = (
    (JsPath \ "name").read[String] and 
    (JsPath \ "created").read[DateTime](jodaDateReads) 
)(User.apply _) 

val userWrites: Writes[User] = (
    (JsPath \ "name").write[String] and 
    (JsPath \ "created").write[DateTime](jodaDateWrites) 
)(unlift(User.unapply)) 

implicit val userFormat: Format[User] = Format(userReads, userWrites) 
+1

Cuối cùng tôi đã hiểu Định dạng Phát. – Fabio

1

Tôi nghĩ bạn nên đặt kiểu User trong Json.toJsonJson.fromJson chức năng. Thay vì

println(Json.toJson(new User("user", new DateTime()))) 
println(Json.fromJson(value)) 

thử:

println(Json.toJson[User](new User("user", new DateTime()))) 
println(Json.fromJson[User](value)) 

Khi bạn thiết lập các loại một cách rõ ràng khuôn khổ sẽ biết những gì đọc/ghi vào sử dụng.

Cập nhật: Nó không nhất thiết phải thiết lập kiểu cho Json.toJson chức năng vì bạn vượt qua đối tượng User như là đối số chức năng và khung xác định loại trong thời gian chạy. Nhưng đối với Json.fromJson[User] bạn phải đặt loại, nếu không khung sẽ không biết loại đối tượng bạn muốn đọc.

3

Tôi biết câu hỏi này đã được trả lời trong một thời gian, nhưng tôi tìm thấy một câu trả lời ngắn gọn hơn

val pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
implicit val dateFormat = Format[DateTime](Reads.jodaDateReads(pattern), Writes.jodaDateWrites(pattern)) 
implicit val userFormat = Json.format[User] 
9

Trong chơi 2.6, cách kinh điển để tuần tự hóa/deserialize joda DateTime json bằng cách sử dụng thư viện play-json-joda. Import the library bằng cách cập nhật build.sbt của bạn. Sau đó, tạo trình đọc json và các nhà văn json như thế này:

import play.api.libs.json.JodaWrites 
implicit val dateTimeWriter: Writes[DateTime] = JodaWrites.jodaDateWrites("dd/MM/yyyy HH:mm:ss") 
import play.api.libs.json.JodaReads 
implicit val dateTimeJsReader = JodaReads.jodaDateReads("yyyyMMddHHmmss") 
+2

Chơi 2.6 có rất nhiều tính năng đẹp, tôi tiếp tục tìm thấy ít chất lượng thay đổi cuộc sống như thế này – ObjectiveTruth

+0

Tôi bỏ phiếu cho điều này là câu trả lời được chấp nhận mới –

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