Scala使用json组合器来验证相等性

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.

我怎样才能做到这一点?

更新:澄清问题并更改代码.

Jam*_*per 6

您可以使用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)