簡體   English   中英

Play Framework Json序列化失敗

[英]Play Framework Json Serialization Failure

我有一個隱式的Json讀寫,如下所示:

  implicit val userJsonWrites = new Writes[User] {
    override def writes(user: User): JsValue = Json.obj(
      idKey -> Json.toJson(user._id),
      firstNameKey -> Json.toJson(user.firstName),
      lastNameKey -> Json.toJson(user.lastName),
      emailKey -> Json.toJson(user.email),
      //passKey -> Json.toJson(user.pass),
      addressKey -> Json.toJson(user.address),
      createDateKey  -> Json.toJson(user.createDate),
      activateDateKey  -> Json.toJson(user.activateDate),
      isUserActivatedKey -> Json.toJson(user.isUserActivated),
      verificationDateKey  -> Json.toJson(user.verificationDate)
    )
  }

  implicit val userJsonReads = new Reads[User] {
    override def reads(json: JsValue): JsResult[User] = {
      val user = User(
        _id = (json \ idKey).as[Option[String]],
        firstName =  (json \ firstNameKey).as[String],
        lastName =  (json \ lastNameKey).as[String],
        email =  (json \ emailKey).as[String],
        pass =  (json \ passKey).as[String],
        address = (json \ addressKey).as[Address],
        createDate =  (json \ createDateKey).as[DateTime],
        activateDate =  (json \ activateDateKey).as[Option[DateTime]],
        verificationDate =  (json \ verificationDateKey).as[Option[DateTime]],
        isUserActivated = (json \ isUserActivatedKey).as[Boolean]
      )

      JsSuccess(user)
    }
  }

編譯時,出現以下錯誤:

Error:(84, 32) not enough arguments for method as: (implicit fjs: play.api.libs.json.Reads[Option[String]])Option[String].
Unspecified value parameter fjs.
        _id = (json \ idKey).as[Option[String]],
                               ^
Error:(84, 32) No Json deserializer found for type Option[String]. Try to implement an implicit Reads or Format for this type.
        _id = (json \ idKey).as[Option[String]],
                           ^

我的用戶對象如下所示:

case class User(
  _id: Option[String],
  createDate: DateTime,
  activateDate: Option[DateTime],
  verificationDate: Option[DateTime],
  email: String,
  pass: String,
  firstName: String,
  lastName: String,
  isUserActivated: Boolean,
  address: Address
)

_id實際上是MongoDB的ObjectId,我必須將其作為選項!

使用asOpt ,請參閱文檔

它看起來應該像;

...
_id = (json \ idKey).asOpt[String]

與編寫自己的邏輯相比,幾乎應該總是偏愛提供的Reads / Writes / Format宏實現:

import play.api.libs.json._

implicit val userJsonWrites = Json.writes[User]
implicit val userJsonReads = Json.reads[User]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM