首页 > 解决方案 > 读取 JSON 时的 ValidationException 消息

问题描述

使用 Play 框架 JSON 库读取 JSON 时遇到问题。

我有这样的案例类:

case class Id(value: UUID)

object Id {
  implicit val format: OFormat[Id] = new OFormat[Id] {
    override def reads(json: JsValue): JsResult[Id] =
      for {
        uuid <- (json \ "id").validate[UUID]
      } yield Id(uuid)

    override def writes(id: Id): JsObject =
      JsObject(
        Seq(
          "id" -> JsString(id.value.toString)
        ))
  }
}

我正在阅读这个 JSON 有效负载:

{
    // other data
    ....
    "id" : "9474df4e-5d80-461f-9de5-a3d4c638485a"
}

但我收到此错误消息:

{"error":"JsResultException(errors:List((/id,List(ValidationError(List(\"9474df4e-5d80-461f-9de5-a3d4c638485a\" is not an object),WrappedArray())))

我不知道如何解决这个问题。

标签: scalaplayframeworkplay-json

解决方案


尝试

case class Id(id: UUID)

object Id {
  implicit val formats = Json.format[Id]
}

object Example extends App {
  val raw =
      """
        |{
        |  "id" : "9474df4e-5d80-461f-9de5-a3d4c638485a"
        |}
      """.stripMargin


  println(Json.parse(raw).as[Id])
}

哪个输出

Id(9474df4e-5d80-461f-9de5-a3d4c638485a)

请注意我们如何将字段从 重命名valueid

case class Id(id: UUID)

如果更喜欢保留带有value字段的模型

case class Id(value: UUID)

然后尝试

case class Id(value: UUID)

object Id {
  implicit val idWrites = new Writes[Id] {
    def writes(id: Id) = Json.toJson(id.value)
  }

  implicit val idReads: Reads[Id] =
    (JsPath \ "id").read[UUID].map(Id.apply)
}

推荐阅读