为什么在JsValue中有验证和validateOpt

问题描述 投票:1回答:1

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将始终包含价值?

scala playframework-2.6
1个回答
4
投票

当null JSON值或缺少JSON路径不被视为错误时,应使用validateOpt。例如,假设我们有以下模型

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)
  }

例如,对比qazxsw poi的反序列化

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,) 取得了成功。

© www.soinside.com 2019 - 2024. All rights reserved.