带空字符串验证的Play2.1 JSON格式
我试图在Play2.1中解组到一个对象时验证JSON。我定义的Format对象仅在JSON中缺少字段时进行验证,但我想验证字段是否为非空字符串。这可能吗?我已经尝试在reads()调用中指定minLength()约束(如图所示),但是我得到一个编译器错误,说找不到minLength。这只是元组方法吗 请参阅以下Specs2 Junit测试,该测试现在失败,但在正确定义约束后应通过:带空字符串验证的Play2.1 JSON格式,json,scala,playframework-2.1,Json,Scala,Playframework 2.1,我试图在Play2.1中解组到一个对象时验证JSON。我定义的Format对象仅在JSON中缺少字段时进行验证,但我想验证字段是否为非空字符串。这可能吗?我已经尝试在reads()调用中指定minLength()约束(如图所示),但是我得到一个编译器错误,说找不到minLength。这只是元组方法吗 请参阅以下Specs2 Junit测试,该测试现在失败,但在正确定义约束后应通过: import org.specs2.mutable._ import play.api.libs.json._
import org.specs2.mutable._
import play.api.libs.json._
class SimpleValidation extends SpecificationWithJUnit{
private val badPayload: JsValue = Json.obj(
"simpleValue1" -> "mySimpleValue", // Comment this line out to pass test
"simpleValue2" -> ""
)
"An IssueFormat" should {
"validate when unmarshalling" in {
badPayload.validate[SimpleObj].fold(
valid = (res => {
// Fail if valid
failure("Payload should have been invalid")
}),
invalid = (e => {
// Should be one error
e.length mustBeEqualTo(1)
}))
}
}
}
import play.api.libs.functional.syntax._
case class SimpleObj(simpleValue1: String, simpleValue2: String)
object SimpleObj {
val simpleReads = (
(__ \ "simpleValue1").read[String] and
(__ \ "simpleValue2").read[String])(SimpleObj.apply _) // read[String](minLength(0)) yields compiler error
val simpleWrites = (
(__ \ "simpleValue1").write[String] and
(__ \ "simpleValue2").write[String])(unlift(SimpleObj.unapply))
implicit val simpleFormat: Format[SimpleObj] = Format(simpleReads, simpleWrites)
}
在浏览了Play2.1文档之后,我添加了一个custome read验证器。如果您将原始问题中的SimpleObj替换为以下内容,测试用例将通过。不确定是否有更简单的方法,但这肯定有效:
object SimpleObj {
// defines a custom reads to be reused
// a reads that verifies your value is not equal to a give value
def notEqual[T](v: T)(implicit r: Reads[T]): Reads[T] = Reads.filterNot(ValidationError("validate.error.unexpected.value", v))(_ == v)
implicit val simpleReads = (
(__ \ "simpleValue1").read[String](notEqual("")) and
(__ \ "simpleValue2").read[String](notEqual("")))(SimpleObj.apply _)
val simpleWrites = (
(__ \ "simpleValue1").write[String] and
(__ \ "simpleValue2").write[String])(unlift(SimpleObj.unapply))
implicit val simpleFormat: Format[SimpleObj] = Format(simpleReads, simpleWrites)
}
您可以在以下内容中使用minLength:
import play.api.libs.json.Reads._
那么minLength应该可用,但是,请尝试以下格式:
implicit val simpleReads = (
(__ \ "simpleValue1").read(minLength[String](1)) and
(__ \ "simpleValue2").read(minLength[String](1))(SimpleObj.apply _)