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
привело к успеху.