Play:如何实现条件JSON验证器

时间:2014-02-17 18:08:50

标签: json scala playframework

我的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当且且仅当coditiontrue时 - 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必须完成,而当它获得更新请求时,只应提供要更新的字段。

1 个答案:

答案 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

  ...
}

我希望有所帮助; - )