我试图为下面的类写一个读取
Locals
我的JSON看起来像这样:
case class User(id: String, imageId: Option[String])
然而,'图像'字段可能不存在,也可能为空。 我的读物看起来像这样:
{
"id": 1
"image": { "id" : 2 }
}
但是这似乎不起作用,当它找到没有图像的样本时我仍然会收到错误。 ' ValidationError [...] error.path.missing [...] / image / id'
如何解决这个问题?我不想创建一个我不会在任何地方使用的Image类。
答案 0 :(得分:2)
我认为问题来自于您尝试阅读String
而 id
是Int
。你应该记住你的json / reader中的类型。
两个选项
id
真的是Int
,请将其视为Int
id
是String
,请更改您的JSON 如果您仍想在案例类中使用String
,则可以执行以下操作:
(JsPath \ "image" \ "id").readNullable[Int].map(_.toString)
答案 1 :(得分:0)
您忘记了两个元素("id"
和"image"
)之间的逗号。这就是解析器似乎缺少/image/id
路径的原因。
有各种用于验证JSON结构的工具,例如https://jsonlint.com/。 所以你的JSON结构应该是这样的:
{
"id": 1,
"image": {
"id": 2
}
}
答案 2 :(得分:0)
我可能会迟到但这是一个解决方法:
implicit val userReader: Reads[User] = (
(JsPath \ "id").read[String] and
(JsPath \ "image" \ "id").readNullable[String].orElse((__ \ "dummy").readNullable[String])
) (User.apply _)
不完美但效果很好
更好的解决方案是直接在orElse中投射Js Reads(JsSuccess(None:Option[Int]))
,但我无法做到......