【问题标题】:Create recursive JSON Writes without combinator pattern创建没有组合模式的递归 JSON 写入
【发布时间】:2015-05-14 14:51:11
【问题描述】:

当使用 JSON 组合器时,可以使用 lazyWrite 创建递归结构,如 documentation 中所述:

implicit lazy val userWrites: Writes[User] = (
  (__ \ "name").write[String] and
  (__ \ "friends").lazyWrite(Writes.seq[User](userWrites))
)(unlift(User.unapply))

在实现写入时是否可以这样做,即:

implicit lazy val userWrites: Writes[User] = new Writes[User]{
    def writes(user: User) = Json.obj(
        "name" -> user.name,
        "friends" -> ??????
    )
}

【问题讨论】:

    标签: json scala recursion playframework playframework-json


    【解决方案1】:

    是的。其实很简单。

    implicit lazy val userWrites: Writes[User] = new Writes[User] {
        def writes(user: User) = Json.obj(
            "name" -> user.name,
            "friends" -> user.friends
        )
    }
    
    
    val joe = User("Joe", Nil)
    val bob = User("Bob", Nil)
    val jane = User("Jane", Seq(bob, joe))
    val james = User("James", Seq(bob, jane))
    
    scala> Json.toJson(james)
    res0: play.api.libs.json.JsValue = {"name":"James","friends":[{"name":"Bob","friends":[]},{"name":"Jane","friends":[{"name":"Bob","friends":[]},{"name":"Joe","friends":[]}]}]}
    

    userWrites 也不需要偷懒。它像这样工作得很好,因为组合器尝试通过隐式解析子写入并沿着树向下工作来生成写入,这就是为什么它需要lazyWrite 来阻止它在递归结构中无限下降。在写 def writes 时,我们明确说明了写的是什么。

    然而,两者都无法将您从这种情况中拯救出来:

    def jim: User = User("Joe", Seq(dwight))
    def dwight: User = User("Bob", Seq(jim))
    

    【讨论】:

    • 你可以让它更简单:implicit lazy val userWrites: Writes[User] = Writes { case User(name, friends) => Json.obj("name" -> name, "friends" -> friends) }
    猜你喜欢
    • 2014-11-26
    • 2010-10-05
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    相关资源
    最近更新 更多