我正在尝试在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]
}
我有两个端点,一个用于创建,一个用于更新
在创建端点中,我只想发送name
和email
。在更新端点中,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]
}
但是它并没有改变任何东西
答案 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]
}