我的Play应用程序有一个像这样的JSON验证器:
val validateAccount = (
((__ \ 'id).json.pickBranch) ~
((__ \ 'name).json.pickBranch) ~ // mandatory
((__ \ 'mobile).json.pickBranch or emptyObj) ~ // optional
...
).reduce
上面的验证器接受至少包含id和可选名称的JSON。是否可以根据条件强制执行字段?例如,如果条件为name
,如何强制true
并在条件为false
时保持可选?
def validateAccount(condition: Boolean) = (
((__ \ 'id).json.pickBranch) ~
((__ \ 'name).json.pickBranch if (condition) or emptyObj else ???) ~
((__ \ 'mobile).json.pickBranch or emptyObj) ~
...
).reduce
我希望emptyObj
当且且仅当codition
为true
时 - emptyObj
只代表一个空节点:
val emptyObj = __.json.put(Json.obj())
[糟糕]解决方案可能是这样的:
def validateAccount(condition: Boolean) = {
(if (condition) {
((__ \ 'id).json.pickBranch) ~
((__ \ 'name).json.pickBranch) ~ // mandatory
((__ \ 'mobile).json.pickBranch or emptyObj) ~ // optional
...
} else {
((__ \ 'id).json.pickBranch) ~
((__ \ 'name).json.pickBranch or emptyObj) ~ // now this is optional
((__ \ 'mobile).json.pickBranch or emptyObj) ~ // optional
...
}).reduce
}
我需要条件JSON验证的原因是当我的REST API获取插入请求时,JSON必须完成,而当它获得更新请求时,只应提供要更新的字段。
答案 0 :(得分:4)
好的......这是解决方案:
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
}
}
object MyObject {
def validateAccount(update: Boolean) = (
((__ \ 'id).json.pickBranch orEmptyIf update) ~ // can be empty only if update is true
((__ \ 'name).json.pickBranch orEmtpy) ~ // can be always empty
((__ \ 'mobile).json.pickBranch orEmpty) ~ // can be always empty
...
).reduce
...
}
我希望有所帮助; - )