播放Json单场读取验证器

Mat*_*ner 4 json scala playframework playframework-2.0

我正在尝试为Play中的传入Json添加简单验证.基于这个问题,我试着写:

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 _)
Run Code Online (Sandbox Code Playgroud)

这不会编译,产生错误:

type mismatch;
[error]  found   : String => ApiData
[error]  required: play.api.libs.json.Reads[?]
[error]     )(ApiData.apply _)
[error]                        ^
[error] one error found
Run Code Online (Sandbox Code Playgroud)

但是如果我添加第二个字段,它会编译:

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 _)
Run Code Online (Sandbox Code Playgroud)

如果只使用一个字段,我需要做什么?

Rya*_*yan 6

由于您只有一个字段,因此您不需要使用组合子语法来创建读取,您只需使用已定义的函数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 _)

}
Run Code Online (Sandbox Code Playgroud)

首先Reads[String],添加一些validation(filter),然后将有效结果转换为您自己的rich类型(map).