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") 
}