![](/img/trans.png)
[英]How to improve the error message readability returned from JsError.toFlatJson or JsError.toJson in Play framework 2.x?
[英]How to add multiple error messages to a JsError without using a var
在以下函数中,我正在解析json
。 我想返回描述json
中所有错误(如果有)的JsError
。 但是我不知道如何在不使用var
情况下继续更改JsError
。 我正在寻找一种更functional
的代码编写方式。
implicit object PQReads extends Reads[PQ] {
def reads(json:JsValue):JsResult[PQ] = {
val id = (json \ "id").asOpt[UUID]
val d = (json \ "d").asOpt[String]
val h = (json \"h").asOpt[List[String]]
val i = (json \ "i").asOpt[List[String]]
//HERE I WANT TO ADD LOGIC TO CHECK THAT ALL THE OPTIONS ARE DEFINED.
//THE ONES WHICH ARE NONE SHOULD BE INDICATED BACK IN JSERROR
// (EG D AND I FIELDS ARE MISSING). HOW DO I DO THIS WITHOUT
// USING VAR TYPE FOR JSERROR.
//IF ALL THE FIELDS ARE PRESENT THEN I'LL RETURN PQ INSTANCE IN JSSUCCESS
}
我已经有一段时间没有使用Play了,但是我认为您不必手动阅读。
当您拥有case class PQ(id: UUID, d :String, h: List[String], i: List[String])
,您只需编写implicit val pqReads = Json.reads[PQ]
。 有关自动映射的文档,请参见此处 。
但是,如果您真的想自己做,请看一下阅读组合器 。
implicit val pqReads: Reads[PQ] = (
(JsPath \ "id").read[UUID] and
(JsPath \ "d").read[String] and
(JsPath \ "h").read[List[String]] and
(JsPath \ "i").read[List[String]]
)(PQ.apply _)
对于转化,
val validJson = Json.parse("""
{
"id": "586c154d-1e0f-428c-97bc-200dec9328bb",
"d": "d",
"h": ["h", "i"],
"i": []
}
""")
println(validJson.validate[PQ])
val invalidJson = Json.parse("""
{
"id": "586c154d-1e0f-428c-97bc-200dec9328bb",
"d": "d",
"h": 123
}
""")
println(invalidJson.validate[PQ])
两个implicit val
提供相同的结果。
JsSuccess(PQ(586c154d-1e0f-428c-97bc-200dec9328bb,d,List(h, i),List()),)
JsError(List((/i,List(JsonValidationError(List(error.path.missing),WrappedArray()))), (/h,List(JsonValidationError(List(error.expected.jsarray),WrappedArray())))))
使用play-json
我总是使用case-classes
!
我将您的问题简化为本质:
import play.api.libs.json._
定义案例类
case class PQ(id:UUID, d:String, h:List[String], i: List[String])
在伴随object
添加格式化程序:
object PQ {
implicit val jsonFormat: Format[PQ] = Json.format[PQ]
}
并使用validate
:
Json.parse(YOUR_JSON).validate[PQ] match {
case JsSuccess(pq, _) => println(pq)
case JSError(errors) => println(s"Handle exception $other")
}
这将返回带有错误的PQ或列表。 无需在这里做任何事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.