播放 Json 单字段读取验证器
Play Json Single Field Reads Validator
我正在尝试向 Play 中的传入 Json 添加简单验证。基于this question,我试着写:
case class ApiData(data: String)
def maxLengthValidator = Reads.StringReads.filter(ValidationError("Error"))(_.length < 100)
implicit val ApiDataReads: Reads[ApiData] = (
(JsPath \ "data").read[String](maxLengthValidator)
)(ApiData.apply _)
这不会编译,产生错误:
type mismatch;
[error] found : String => ApiData
[error] required: play.api.libs.json.Reads[?]
[error] )(ApiData.apply _)
[error] ^
[error] one error found
但是如果我添加第二个字段,它会编译:
case class ApiData(data: String, __doNotUse: Option[Int])
implicit val ApiDataReads: Reads[ApiData] = (
(JsPath \ "data").read[String](maxLengthValidator) and
(JsPath \ "__doNotUse").readNullable[Int]
)(ApiData.apply _)
我需要做什么才能使它只使用一个字段?
因为你只有一个字段,你不需要组合器语法来创建一个读取,你可以只使用已经在 Reads
上定义的函数来构建你想要的。
def maxLengthValidator = Reads.of[String].filter(ValidationError("Error"))(_.length < 100)
case class ApiData(data: String)
object ApiData {
implicit val reads: Reads[ApiData] = (__ \ "data").read(maxLengthValidator).map(ApiData.apply _)
}
您从 Reads[String]
开始,添加一些验证 (filter
),然后将有效结果转换为您自己的丰富类型 (map
)。
我正在尝试向 Play 中的传入 Json 添加简单验证。基于this question,我试着写:
case class ApiData(data: String)
def maxLengthValidator = Reads.StringReads.filter(ValidationError("Error"))(_.length < 100)
implicit val ApiDataReads: Reads[ApiData] = (
(JsPath \ "data").read[String](maxLengthValidator)
)(ApiData.apply _)
这不会编译,产生错误:
type mismatch;
[error] found : String => ApiData
[error] required: play.api.libs.json.Reads[?]
[error] )(ApiData.apply _)
[error] ^
[error] one error found
但是如果我添加第二个字段,它会编译:
case class ApiData(data: String, __doNotUse: Option[Int])
implicit val ApiDataReads: Reads[ApiData] = (
(JsPath \ "data").read[String](maxLengthValidator) and
(JsPath \ "__doNotUse").readNullable[Int]
)(ApiData.apply _)
我需要做什么才能使它只使用一个字段?
因为你只有一个字段,你不需要组合器语法来创建一个读取,你可以只使用已经在 Reads
上定义的函数来构建你想要的。
def maxLengthValidator = Reads.of[String].filter(ValidationError("Error"))(_.length < 100)
case class ApiData(data: String)
object ApiData {
implicit val reads: Reads[ApiData] = (__ \ "data").read(maxLengthValidator).map(ApiData.apply _)
}
您从 Reads[String]
开始,添加一些验证 (filter
),然后将有效结果转换为您自己的丰富类型 (map
)。