15

Tôi đang cố gắng sắp xếp một số mô hình tương đối đơn giản vào json. Ví dụ: tôi muốn lấy đại diện json của:serializing các đối tượng để json với play.api.libs.json

case class User(val id: Long, val firstName: String, val lastName: String, val email: Option[String]) { 
    def this() = this(0, "","", Some("")) 
} 

Tôi có cần phải viết định dạng của riêng mình [Người dùng] với phương pháp đọc và viết thích hợp hoặc có cách nào khác không? Tôi đã xem xét https://github.com/playframework/Play20/wiki/Scalajson nhưng tôi vẫn còn một chút bị mất.

Trả lời

22

Có, viết ví dụ Format của riêng bạn là the recommended approach. Căn cứ vào lớp sau, ví dụ:

case class User(
    id: Long, 
    firstName: String, 
    lastName: String, 
    email: Option[String] 
) { 
    def this() = this(0, "","", Some("")) 
} 

Các ví dụ có thể trông như thế này:

import play.api.libs.json._ 

implicit object UserFormat extends Format[User] { 
    def reads(json: JsValue) = User(
    (json \ "id").as[Long], 
    (json \ "firstName").as[String], 
    (json \ "lastName").as[String], 
    (json \ "email").as[Option[String]] 
) 

    def writes(user: User) = JsObject(Seq(
    "id" -> JsNumber(user.id), 
    "firstName" -> JsString(user.firstName), 
    "lastName" -> JsString(user.lastName), 
    "email" -> Json.toJson(user.email) 
)) 
} 

Và bạn muốn sử dụng nó như thế này:

scala> User(1L, "Some", "Person", Some("[email protected]")) 
res0: User = User(1,Some,Person,Some([email protected])) 

scala> Json.toJson(res0) 
res1: play.api.libs.json.JsValue = {"id":1,"firstName":"Some","lastName":"Person","email":"[email protected]"} 

scala> res1.as[User] 
res2: User = User(1,Some,Person,Some([email protected])) 

Xem the documentation để biết thêm thông tin .

+0

Fantastic, cảm ơn! Và nếu tôi muốn một Seq [User] là Json thì sao? :) – LuxuryMode

+0

Chơi đi kèm với một thể hiện cho 'Seq', vì vậy bạn chỉ có thể sử dụng' Json.toJson (người dùng) .as [Seq [User]] '. –

+0

Sử dụng 'JsNumber' của Play với Mongo, tôi nhận được lỗi serialization:' [error] play - Không thể gọi hành động, cuối cùng cũng gặp lỗi: java.lang.IllegalArgumentException: không thể tuần tự hóa lớp scala.math.BigDecimal' –

6

Nhờ thực tế tài là một lớp trường hợp bạn cũng có thể làm một cái gì đó như thế này:

implicit val userImplicitWrites = Json.writes[User] 
val jsUserValue = Json.toJson(userObject) 

mà không cần viết Format riêng bạn [User]. Bạn có thể làm tương tự với dòng chữ:

implicit val userImplicitReads = Json.reads[User] 

tôi đã không tìm thấy nó trong các tài liệu, đây là liên kết tới các api: http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.libs.json.Json $

+0

Chỉ để hoàn thành - không cần sử dụng hàm ý: 'Json.reads [User] .reads (myJson) .get' – Ixx

+0

Điều này bây giờ nên được đánh dấu là câu trả lời. Đây là liên kết cho tài liệu được cập nhật: https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomated –

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