nul*_*ull 9 json scala playframework playframework-2.0
我有一个使用scala构建的带有Play框架v2.3的JSON REST API服务器,我有这样的控制器动作,例如:
  def register = Action.async(BodyParsers.parse.json) { implicit request => 
      request.body.validate[Register].fold(
        errors => Future.successful(BadRequest(JsError.toFlatJson(errors))),
        register => {
            // do something here if no error...
          }
      )
    }
为简单起见,我处理了验证错误JsError.toFlatJson(注意:JsError.toFlatJson在较新的Play中不推荐使用,替换是JsError.toJson).
问题是json结果有如下隐秘的消息:
{"obj.person.email":[{"msg":"error.email","args":[]}]}
以上json表示该人的电子邮件无效.
有没有办法将错误json结果转换为更可读的消息?
我不希望客户端应用程序应该做的映射/转换obj.person.email或error.email.我更喜欢服务器在将json返回到客户端应用程序之前执行此操作.
您的部分问题可以通过在您的类Reads组合器中定义自定义错误消息来解决orElse:
case Point(x: Int, y: Int)
object Point {
    implicit val pointReads: Reads[Point] = (
        (__ \ "x").read[Int].orElse(Reads(_ => JsError("Could not parse given x value.")))
        (__ \ "y").read[Int].orElse(Reads(_ => JsError("Could not parse given y value.")))
    )(Point.apply _)
}
给定此类的一些无效 JSON,您现在将收到有关验证问题的自定义错误消息:
scala> val incorrectJson = Json.parse("""{"y": 1}""")
incorrectJson: play.api.libs.json.JsValue = {"y":1}
scala> val validationResult = incorrectJson.validate[Point]
validationResult: play.api.libs.json.JsResult[playground.Point] = JsError(List((/x,List(ValidationError(List(Could not read the point's x value.),WrappedArray())))))
scala> validationResult.fold(error => { println(JsError.toJson(error)) }, a => { a })
{"obj.x":[{"msg":["Could not read the point's x value."],"args":[]}]}
为了更改obj.x标识符,您必须自己对返回的 JsValue 进行后处理,因为它源自JsPath.