使用默认值播放2.6 Scala 2.12.6解析请求

问题描述 投票:0回答:2

我试图解析Scala中的请求

例如,我有这个case class

case class User(
  id: Option[Long] = None,
  name: Option[String] = None,
  email: Option[String] = None,
  firstname: Option[String] = None,
  lastname: Option[String] = None,
  isActive: Boolean = true
)

object User {
  implicit val User = Json.format[User]
}

我有两个端点用于创建,一个用于更新

在创建端点我只想发送nameemail。在更新端点中,id将位于路径中,所有其他字段都是可选的或具有默认值。

控制器接收请求并解析这样的数据

def post: Action[JsValue] = Action.async(parse.json) { implicit request =>
  request.body.validate[User].fold(
  ...
}

问题是当控制器验证json主体时,它不会添加具有默认值的可选字段。

我尝试添加这样的东西

object User {
  implicit def jsonFormat = Json.using[Json.WithDefaultValues].format[User]
}

但它没有改变任何东西

scala playframework
2个回答
1
投票

你可以尝试这样的事情。

case class User(
  id: Option[Long],
  name: Option[String],
  email: Option[String],
  firstname: Option[String],
  lastname: Option[String],
  isActive: Boolean)

object User {
  val userReads: Reads[User] = Reads {
    case v: JsObject => JsSuccess(User(
      (v \ "id").asOpt[Long],
      (v \ "name").asOpt[String],
      (v \ "email").asOpt[String],
      (v \ "firstname").asOpt[String],
      (v \ "lastname").asOpt[String],
      (v \ "isActive").asOpt[Boolean].getOrElse(true)
    ))

    case _ => JsError(JsonValidationError("Value User is not valid JSON Object."))
  }

  val userWrites: Writes[User] = new Writes[User] {
    override def writes(v: User): JsValue = Json.obj(
      "id" -> v.id,
      "name" -> v.name,
      "email" -> v.email,
      "firstname" -> v.firstname,
      "lastname" -> v.lastname,
      "isActive" -> v.isActive
    )
  }

  implicit val user: Format[User] = Format(userReads, userWrites)
}

用法:

  val js: JsValue = Json.parse("""{
    "id": 1,
    "firstname": "rex",
    "lastname": "ards"
  }""")

  println(js.as[User])

让我知道它是否有帮助:) ..


0
投票

@Rex的答案适用于Play早期版本,但适用于Play 2.6

object User {
  implicit def jsonFormat = Json.using[Json.WithDefaultValues].format[User]
}
© www.soinside.com 2019 - 2024. All rights reserved.