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

时间:2019-02-27 16:13:50

标签: scala playframework

我正在尝试在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]
}

但是它并没有改变任何东西

2 个答案:

答案 0 :(得分: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])

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

答案 1 :(得分:0)

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

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