为什么在JsValue中有一个validate和validateOpt

时间:2019-04-26 16:26:53

标签: scala 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中成功地将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" } 的意义又是什么呢?

1 个答案:

答案 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成功的地方。