Playframework Play:最简洁的JSON验证形式

Playframework Play:最简洁的JSON验证形式,playframework,Playframework,我想问一个关于JSON验证最简洁的方法的问题!框架 在官方的游戏教程中,我找到了关于JSON宏初始的主题。其序列化/反序列化的主要思想看起来相当不错: import play.api.libs.json._ case class Person(name: String, age: Int) object Person{ implicit val personFmt = Json.format[Person] } 但是,如果我想在这里设置一些验证约束,该怎么办?例如,我想接受18-60岁

我想问一个关于JSON验证最简洁的方法的问题!框架

在官方的游戏教程中,我找到了关于JSON宏初始的主题。其序列化/反序列化的主要思想看起来相当不错:

import play.api.libs.json._

case class Person(name: String, age: Int)

object Person{
  implicit val personFmt = Json.format[Person]
}
但是,如果我想在这里设置一些验证约束,该怎么办?例如,我想接受18-60岁?在这种情况下,我是否应该回到标准的


如果要保留所有验证错误,请单击“是”,谢谢。似乎有
filter
filterNot
函数,您可以在其中添加自己的验证错误,但它们最终会像定义
读取那样冗长:

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

case class Person(name: String, age: Int)

object Person{
    implicit val personFmt: Reads[Person] = (
        (__ \ "name").read[String] and 
        (__ \ "age").read[Int](Reads.min(18) keepAnd Reads.max(60))
    )(Person.apply _)
}

我通常会使用上面更详细的样式定义我的
读取
,而
写入
则使用
Json.Writes[T]
宏,因为我通常不需要约束返回到客户端的内容。

我想您正在寻找。例如,您可以按如下方式验证Person实例:

implicit val PersonReads : Reads[Person] = (
  (JsPath \ "name").read[String] and
  (JsPath \ "age").read[Int](min(18) keepAnd max(60))
)(Person.apply _)
您还可以定义用于隐式转换的自定义
格式[Person]
,以及混合使用
读取[Person]
写入[Person]

val personReads: Reads[Person] = (
  (JsPath \ "name").read[String] and
  (JsPath \ "age").read[Int](min(18) keepAnd max(60))
)(Person.apply _)

val personWrites: Writes[Person] = (
  (JsPath \ "name").write[String] and
  (JsPath \ "age").write[Int]
)(unlift(Person.unapply))

implicit val personFormat: Format[Person] =
  Format(personReads, personWrites)

谢谢,就像我以前想的那样,有什么帮助的答案吗?如果是,不要忘记接受其中一个:)