【发布时间】:2018-02-27 11:02:44
【问题描述】:
JsPath.scala中lazyRead方法的描述如下:
/*case class User(id: Long, name: String, friend: User)
implicit lazy val UserReads: Reads[User] = (
(__ \ 'id).read[Long] and
(__ \ 'name).read[String] and
(__ \ 'friend).lazyRead(UserReads)
)(User.apply _) */
def lazyRead[T](r: => Reads[T]): Reads[T] = Reads(js => Reads.at[T]
(this)(r).reads(js))
当我尝试执行上述示例的简化版本时:
case class User(id:Int, user: User)
val userJsVal = Json.parse(
"""
| {
| "id" : 22,
| "user" : { "id":2 }
| }
""".stripMargin)
implicit lazy val UserReads: Reads[User] = (
(__ \ 'id).read[Int] and
( __ \ 'user).lazyRead(UserReads)
)(User.apply _)
val us = Json.fromJson[User](userJsVal)(UserReads);
us match {
case s:JsSuccess[User] => println(s.get)
case e:JsError => println(JsError.toJson(e).toString()) }
我得到错误:
{"obj.user.user":[{"msg":["error.path.missing"],"args":[]}]}
我尝试将最里面的“用户”设置为 null,但这也不起作用。我应该如何构建我的 json 或添加终止条件:
( __ \ 'user).lazyRead(UserReads)
要获得有效的反序列化输出?
【问题讨论】:
-
还尝试了代码 [gist.github.com/mandubian/6046786],它给出了以下错误:
forward reference extends over definition of value treeReads [error] ( __ \ "l").lazyRead(treeReads) and [error]^ -
恕我直言
case class User(id: Int, user: Option[User])将是更安全的定义,以避免在运行时检查 null 和 NPE
标签: json scala deserialization playback recursive-datastructures