Play Framework:解析JSON时如何验证可选字段

Play Framework:解析JSON时如何验证可选字段,json,scala,playframework,Json,Scala,Playframework,给定以下JSON { "nickname": "mj", "firstname": "Mike", "lastName": "Jordan", "trash": "ignore" } 。。。我需要解析和验证它,以便 除了昵称、名字和姓氏之外的任何字段都将被过滤掉–在我上面的示例中,必须删除垃圾 如果已定义,昵称(可选)长度必须至少为3个字符 下面是我的代码: import play.api.libs.json._ import play.api.libs

给定以下JSON

{
     "nickname": "mj",
     "firstname": "Mike",
     "lastName": "Jordan",
     "trash": "ignore"
}
。。。我需要解析和验证它,以便

  • 除了
    昵称
    名字
    姓氏
    之外的任何字段都将被过滤掉–在我上面的示例中,必须删除
    垃圾
  • 如果已定义,
    昵称
    (可选)长度必须至少为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) }
    )
    
    import play.api.libs.json_
    导入play.api.libs.functional.syntax_
    def orEmpty=reads | u.json.put(json.obj())
    val js=Json.parse(“{”昵称“:“mj”,“姓氏“:“Mike”,“姓氏“:“Jordan”}”)
    val validateUser=(
    (((_\'昵称).json.pickBranch(读取.of[JsString]JsSuccess(js)),
    无效=>{errors=>JsError(errors)}
    )
    

    问题是,如果
    昵称
    因少于3个字符而无效,则应用
    或空
    且不报告错误。我需要的是保留
    昵称
    可选(这就是我定义
    或空
    的原因),但定义后,如果且仅当
    nickanme
    通过
    Reads.minLength
    检查时,验证才会成功。

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

    如果假设JSON验证器和转换器实际上只是
    Reads[T],那么就更容易对此进行推理
    
    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))))))