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