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...
}
)
}
Run Code Online (Sandbox Code Playgroud)
为简单起见,我处理了验证错误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 _)
}
Run Code Online (Sandbox Code Playgroud)
给定此类的一些无效 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":[]}]}
Run Code Online (Sandbox Code Playgroud)
为了更改obj.x
标识符,您必须自己对返回的 JsValue 进行后处理,因为它源自JsPath
.
归档时间: |
|
查看次数: |
724 次 |
最近记录: |