Play Framework:解析JSON时如何验证可选字段
给定以下JSONPlay 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
{
"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))))))