Play Framework:* pickBranch *和*或*

时间:2014-02-18 18:03:44

标签: json scala playframework

在以下声明中,pickBranch会返回Reads ...

((__ \ 'firstName).json.pickBranch)

...我可以像这样调用or

val emptyObj = __.json.put(Json.obj())
((__ \ 'firstName).json.pickBranch or emptyObj)

如果pickBranch成功,则or会返回pickBranch的结果,否则会返回emptyObj

现在,是否可以在or返回的Reads上调用pickBranch并传递emptyObjpickBranch返回的内容?

val emptyAllowed = true
((__ \ 'firstName).json.pickBranch or (if (emptyAllowed) emptyObj else >>>RESULT OF pickBranch<<<))

1 个答案:

答案 0 :(得分:1)

好的,这是解决方案。首先,我为Reads创建了扩展对象:

package object typeExtensions {

  import play.api.libs.json._
  import play.api.libs.functional.syntax._

  implicit class ReadsExtensions(reads: Reads[JsObject]) extends AnyVal {

    def orEmpty = reads | __.put(Json.obj())
    def orEmptyIf(b: Boolean) = if (b) orEmpty else reads 
  }
}

以下是如何使用它:

val canBeEmpty: Boolean = true
((__ \ 'firstName).json.pickBranch orEmptyIf canBeEmpty))

有关详情,请参阅我的完整答案here。 我希望有所帮助。