Scala 如何在不使用var的情况下向JsError添加多条错误消息
在下面的函数中,我正在解析一个Scala 如何在不使用var的情况下向JsError添加多条错误消息,scala,playframework-2.6,Scala,Playframework 2.6,在下面的函数中,我正在解析一个json。我想返回JsError,它描述了json中的所有错误(如果有)。但是我不知道如何在不使用var的情况下不断更改JsError。我正在寻找一种更实用的编写代码的方法 implicit object PQReads extends Reads[PQ] { def reads(json:JsValue):JsResult[PQ] = { val id = (json \ "id").asOpt[UUID] val d = (json \
json
。我想返回JsError
,它描述了json
中的所有错误(如果有)。但是我不知道如何在不使用var
的情况下不断更改JsError
。我正在寻找一种更实用的编写代码的方法
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了,但我认为你不必手动阅读 当您有
案例类PQ(id:UUID,d:String,h:List[String],i:List[String])
,
您只需编写隐式val pqReads=Json.reads[PQ]
。
有关自动映射的文档,请参阅
但是如果你真的想自己做,看看下面的例子
对于转换
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])
两个隐式val
s提供相同的结果
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())))))
使用
播放json
时,我总是使用案例类
我将你的问题简化为本质:
import play.api.libs.json._
定义案例类
case class PQ(id:UUID, d:String, h:List[String], i: List[String])
在附带的对象中添加格式化程序
:
object PQ {
implicit val jsonFormat: Format[PQ] = Json.format[PQ]
}
并使用验证:
Json.parse(YOUR_JSON).validate[PQ] match {
case JsSuccess(pq, _) => println(pq)
case JSError(errors) => println(s"Handle exception $other")
}
这将返回PQ或带有错误的列表。无需在此处执行任何操作。我扩展读取的原因是为了自定义错误messages@cchantep,我认为这次问“你试过什么”是不公平的。“自己尝试”意味着重新设计验证应用程序。当一个人甚至不知道这个概念的名字时,谷歌搜索真的毫无用处。事实上,我对提问者感觉“有更好的方法”并提出问题的能力表示赞赏。我通常的做法是检查哪个字段为空,然后使用if
条件构建错误消息。但我不确定这是否是最好的方法,因为代码并不简洁。因此,我想检查是否有更好的(功能性的)方法
Json.parse(YOUR_JSON).validate[PQ] match {
case JsSuccess(pq, _) => println(pq)
case JSError(errors) => println(s"Handle exception $other")
}