scala - 读取 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())))
我不知道如何解决这个问题。
解决方案
尝试
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)
请注意我们如何将字段从 重命名value
为id
:
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)
}
推荐阅读
- javascript - tslint CLI 和 jest CLI 在 iterm zsh macOS 上不起作用
- reactjs - this.props.x 不是函数,尽管 x 已绑定。反应.js
- php - php中的fibanocci系列
- c# - WMI 查询不更新
- c# - 数据库如何为 Windows 开发工作?
- php - 如何用一些值增加变量并重新排序结果
- php - Same Technic 无法更新和删除 while 循环记录
- firebase - VueJS + Firebase Auth + Route Guards - 同步问题/竞争条件
- python - 无法获取属性“Word2VecKeyedVectors”
- .net - 将“obj”向下转换为没有类型注释的底层数组类型