【问题标题】:Play Framework: How to Validate Optional Fields When Parsing JSONPlay Framework:解析 JSON 时如何验证可选字段
【发布时间】:2015-12-16 21:15:22
【问题描述】:

鉴于以下 JSON...

{
     "nickname": "mj",
     "firstname": "Mike",
     "lastName": "Jordan",
     "trash": "ignore"
}

...我需要对其进行解析和验证,以便

  1. nicknamefirstNamelastName 之外的任何字段都被过滤掉——在我上面的示例中,trash 必须被删除
  2. 如果已定义,nickname(可选)必须至少为 3 个字符长

下面是我的代码:

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

def orEmpty = reads | __.json.put(Json.obj())    

val js = Json.parse("""{ "nickname": "mj", "firstname": "Mike", "lastName": "Jordan" }""")

val validateUser = (
  ((__ \ 'nickname).json.pickBranch(Reads.of[JsString] <~ Reads.minLength[String](3)) orEmpty) ~
  ((__ \ 'firstName).json.pickBranch) ~
  ((__ \ 'lastName).json.pickBranch)
)

validateUser.reads(js).fold(
  valid = { validated => JsSuccess(js) },
  invalid => { errors => JsError(errors) }
)

问题是,如果nickname因为少于3个字符而无效,则orEmpty适用且不报错。我需要保持nickname 可选(这就是我定义orEmpty 的原因),但是当且仅当nickanme 通过Reads.minLength 检查时,验证才会成功。

【问题讨论】:

    标签: json scala playframework


    【解决方案1】:

    假设 Play Framework 2.4.x。我相信在 2.3.x 中读取可空字段有点不同,但想法是一样的。

    如果您假设 JSON 验证器和转换器实际上只是 Reads[T &lt;: JsValue],这将更容易推理。

    总的来说,您需要考虑的是nickname 字段实际上是可选的,您需要将其表示为这样。基本上,您正在寻找的是用Reads.minLength 组合nullableReads 来读取昵称为Option[String]

    因此,您可以将要验证的结构表示为:

    case class ToValidate(nickname: Option[String], firstname: String, lastname: String)
    

    并定义你是读者:

    import play.api.libs.json._
    import play.api.libs.json.Reads._
    import play.api.libs.functional.syntax._
    
    implicit val toValidateReads: Reads[ToValidate] = (
      (__ \ "nickname").readNullable[String](minLength(3)) ~
      (__ \ "firstname").read[String] ~
      (__ \ "lastname").read[String]
    )(ToValidate.apply _)
    

    然后您可以验证您的输入:

    val js = Json.parse("""{ "nickname": "mj", "firstname": "Mike", "lastname": "Jordan" }""")
    val v = js.validate[ToValidate]
    println(v) // JsError(List((/nickname,List(ValidationError(List(error.minLength),WrappedArray(3))))))
    

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多