Scala使用嵌套的可选属性读取对象

时间:2017-06-22 15:53:53

标签: json scala playframework-2.0

我试图为下面的类写一个读取

Locals

我的JSON看起来像这样:

case class User(id: String, imageId: Option[String])

然而,'图像'字段可能不存在,也可能为空。 我的读物看起来像这样:

{
  "id": 1
  "image": { "id" : 2 }
}

但是这似乎不起作用,当它找到没有图像的样本时我仍然会收到错误。 ' ValidationError [...] error.path.missing [...] / image / id'

如何解决这个问题?我不想创建一个我不会在任何地方使用的Image类。

3 个答案:

答案 0 :(得分:2)

我认为问题来自于您尝试阅读String idInt 。你应该记住你的json / reader中的类型。

两个选项

  • 如果id真的是Int,请将其视为Int
  • 如果idString,请更改您的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])),但我无法做到......