Play 框架 - 跨领域阅读
Play framework - Cross fields Read
有没有办法根据不同的字段来读取字段?
是这样的class:
case class Person(children: List[String], hasChildren: Boolean)
我想根据 children 列表填充 hasChildren。
所以我尝试了以下阅读:
implicit val personReads: Reads[Person] = (
(JsPath \ "children").readNullable[List[String]].map(_.getOrElse(List())) and
(JsPath \ "hasChildren").read[Boolean](
(JsPath \ "children").readNullable[List[String]].map{
case Some(opt) => opt.nonEmpty
case None => false
}))
但是尽管我提供了 children 它符合 None 的情况,并且 return false.
我做错了什么?可能吗?
当然有可能。您的思考方向是正确的(使用 map
)。你的 reader 必须是
(
(__ \ "children").readNullable[List[String]].map(_.getOrElse(List())) and
(__ \ "children").readNullable[List[String]].map(_.exists(_.nonEmpty))
)(Person.apply _)
您必须实施 reader 并使用与您的案例 class 相似的属性顺序和类型。路径中使用的属性名称并不重要。
重要提示: readNullable[T]
在 JsPath 中搜索可选或可为空的字段(未找到字段或为空 None)。
有没有办法根据不同的字段来读取字段?
是这样的class:
case class Person(children: List[String], hasChildren: Boolean)
我想根据 children 列表填充 hasChildren。
所以我尝试了以下阅读:
implicit val personReads: Reads[Person] = (
(JsPath \ "children").readNullable[List[String]].map(_.getOrElse(List())) and
(JsPath \ "hasChildren").read[Boolean](
(JsPath \ "children").readNullable[List[String]].map{
case Some(opt) => opt.nonEmpty
case None => false
}))
但是尽管我提供了 children 它符合 None 的情况,并且 return false.
我做错了什么?可能吗?
当然有可能。您的思考方向是正确的(使用 map
)。你的 reader 必须是
(
(__ \ "children").readNullable[List[String]].map(_.getOrElse(List())) and
(__ \ "children").readNullable[List[String]].map(_.exists(_.nonEmpty))
)(Person.apply _)
您必须实施 reader 并使用与您的案例 class 相似的属性顺序和类型。路径中使用的属性名称并不重要。
重要提示: readNullable[T]
在 JsPath 中搜索可选或可为空的字段(未找到字段或为空 None)。