在以下声明中,pickBranch
会返回Reads
...
((__ \ 'firstName).json.pickBranch)
...我可以像这样调用or
:
val emptyObj = __.json.put(Json.obj())
((__ \ 'firstName).json.pickBranch or emptyObj)
如果pickBranch
成功,则or
会返回pickBranch
的结果,否则会返回emptyObj
。
现在,是否可以在or
返回的Reads
上调用pickBranch
并传递emptyObj
或pickBranch
返回的内容?
val emptyAllowed = true
((__ \ 'firstName).json.pickBranch or (if (emptyAllowed) emptyObj else >>>RESULT OF pickBranch<<<))
答案 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。 我希望有所帮助。