Man*_*dha 2 scala playframework play-json playframework-2.6
JsValue 有两种方法
def validate[A](implicit rds: Reads[A]): JsResult[A] - 尝试将节点转换为 JsResult[T](成功或错误)。
def validateOpt[A](implicit rds: Reads[A]): JsResult[Option[A]] - 我想它也做同样的事情。
在什么情况下会validateOpt用到?在我看来,如果JsResult失败,那么我会在JsError. 那么,Option在成功转换为类型后,额外的in JsSuccessas层JsSuccess将始终包含值有什么意义呢?JsValueA
validateOpt当空 JSON 值或丢失的 JSON 路径不被视为错误时,应使用。例如,假设我们有以下模型
case class Person(
name: String
employer: Option[String]
)
Run Code Online (Sandbox Code Playgroud)
其中employerfield 是可选的,因为一个人不被雇用是完全合理的,而他们总是有一个名字。然后反序列化以下 JSON
{
"name": "Picard"
}
Run Code Online (Sandbox Code Playgroud)
即使employer缺少路径也应该成功。因此手动定义Reads[Person]将使用validateOpt像这样
implicit val personRead: Reads[Person] = Reads { json =>
for {
name <- (json \ "name").validate[String]
employer <- (json \ "employer").validateOpt[String]
} yield Person(name, employer)
}
Run Code Online (Sandbox Code Playgroud)
也对比反序列化null,例如
val raw = "null"
val json = Json.parse(raw)
println(json.validate[String])
println(json.validateOpt[String])
Run Code Online (Sandbox Code Playgroud)
应该输出
JsError(List((,List(JsonValidationError(List(error.expected.jsstring),WrappedArray())))))
JsSuccess(None,)
Run Code Online (Sandbox Code Playgroud)
我们看到的validateOpt结果是成功。