And*_*rov 2 json scala playframework playframework-2.0
我正在使用play 2.2.0 Reads来验证我的应用程序中的传入请求.
我正在尝试使用json API实现一个非常简单的事情.我有一个这样的json:
{
"field1": "some value",
"field2": "some another value"
}
Run Code Online (Sandbox Code Playgroud)
我已经Reads检查了其他东西,比如最小长度
case class SomeObject(field1: String, field2: String)
implicit val someObjectReads = (
(__ \ "field1").read(minLength[String](3)) ~
(__ \ "field2").read(minLength[String](3))
)(SomeObject)
Run Code Online (Sandbox Code Playgroud)
我想创建一个解析器组合器,它将匹配两个字段的值,JsSuccess如果值相等则返回,否则JsError将其与现有组合Reads.
我怎样才能做到这一点?
更新:澄清问题并更改代码.
您可以使用filter对已解析的值进行进一步验证:
import play.api.data.validation._
import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.libs.json.Reads._
case class SomeObject(field1: String, field2: String)
implicit val someObjectReads = (
(__ \ "field1").read(minLength[String](3)) ~
(__ \ "field2").read(minLength[String](3))
)(SomeObject).filter(
ValidationError("field1 and field2 must be equal")
) { someObject =>
someObject.field1 == someObject.field2
}
Run Code Online (Sandbox Code Playgroud)
如果您希望针对每个字段列出错误消息,那么您将不得不使用flatMap,例如:
implicit val someObjectReads = (
(__ \ "field1").read(minLength[String](3)) ~
(__ \ "field2").read(minLength[String](3))
)(SomeObject).flatMap { someObject =>
Reads { _ =>
if (someObject.field1 == someObject.field2) {
JsSuccess(someObject)
} else {
JsError(Seq(
JsPath("field1") -> Seq(ValidationError("field1 and field2 must be equal")),
JsPath("field2") -> Seq(ValidationError("field1 and field2 must be equal"))
))
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |