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
中成功地将JsSuccess
转换为类型JsSuccess
之后,在JsValue
中附加A
作为 {
"short_name": "React PWA App",
"name": "Create React PWA App Sample",
"icons": [{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "icon.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/",
"display": "standalone",
"theme_color": "#00b7a8",
"background_color": "#096386"
}
的意义又是什么呢?
答案 0 :(得分:4)
validateOpt
应当被认为是无效的JSON值或缺少JSON路径的错误。例如,假设我们有以下模型
case class Person(
name: String
employer: Option[String]
)
其中employer
字段是可选的,因为对于一个没有被雇用的人来说是完全合理的,而他们总是有一个名字。然后反序列化以下JSON
{
"name": "Picard"
}
即使缺少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)
}
例如,null
的反序列化也相反
val raw = "null"
val json = Json.parse(raw)
println(json.validate[String])
println(json.validateOpt[String])
应输出
JsError(List((,List(JsonValidationError(List(error.expected.jsstring),WrappedArray())))))
JsSuccess(None,)
我们看到validateOpt
成功的地方。