【问题标题】:Serializing a tree in Play for Scala在 Play for Scala 中序列化树
【发布时间】:2016-11-05 16:05:11
【问题描述】:

我有以下作为树节点的类:

case class Node[A] ( id: Int, data: A, var children: Option[Seq[Node[A]]],
                        var parent: Option[Node[A]] )

其中id为节点id号,data表示节点中存储的信息,children为子节点列表,parent为父节点。

我想用树生成一个json,所以我写了下面的隐式val:

implicit val nodeWrite : Writes[Node[Data]] = (
      (JsPath \ "sk").write[Int] and
      (JsPath \ "dat").write[Data] and
      (JsPath \ "ch").write[Option[Seq[Node[Data]]]] and
      (JsPath \ "par").write[Option[Node[Data]]]
  ) (unlift(Node[Data].unapply))

但是编译器抱怨:

对象节点中的方法应用缺少参数列表未应用 仅当函数类型为 预期的。您可以通过编写 apply _ 或 apply(,,,) 而不是 apply。

如何解决这个问题?

更新

数据定义为:

case class Data (descrip: String)

更新 2

因为我需要一棵有 N 个根的树,所以我创建了一个包含一系列节点的 Tree 类。

case class Tree[A] ( var nodes: Option[Seq[Node[A]]] )

但是我在序列化树时遇到了问题:

  implicit val treeWrite : Writes[Tree[Data]] = new Writes[Tree[Data]] {
    def writes(x: Tree[Data]) = {
      Json.obj(
        "nodes" -> x.nodes.map(_.map(n => writes(n)))
        )
    }
  }

它抛出

类型不匹配;发现:需要选项[Nothing]: play.api.libs.json.Json.JsValueWrapper

x.nodes.map 行中。

【问题讨论】:

  • 什么是Data,你是如何编译Node[Data].unapply的?
  • 看看更新。我无法编译 Writes 对象

标签: scala playframework playframework-2.0


【解决方案1】:

我没有完整的答案,但您可以通过指定类型来帮助编译器:

(unlift[Node[Data],(Int, Data, Option[Seq[Node[Data]]], Option[Node[Data]])]
  (Node.unapply[Data](_)))

但这对您没有帮助,因为您必须使用带有lazyWrite 的递归类型。我建议在这里使用更明确的方法:

implicit val nodeWrite : Writes[Node[Data]] = new Writes[Node[Data]] {
  def writes(x: Node[Data]) = {
    Json.obj(
      "id" -> x.id,
      "data" -> x.data,
      "children" -> x.children.map(_.map(n => writes(n))),
      "parent" -> x.parent.map(n => writes(n)))
  }
}
val child = Node(1, "child", None, None)
val node = Node(1, "data", Some(List(child)), None)

Json toJson node
res0: play.api.libs.json.JsValue = {"id":1,"data":"data",
   "children":[{"id":1,"data":"child","children":null,"parent":null}],"parent":null}

添加空处理,你会没事的。

【讨论】:

  • 我已经接受了你的回答,但我还有一个问题,你能看看更新2吗?谢谢!
  • @ps0604 在您的更新中您使用了错误的写入。试试这个:"nodes" -> x.nodes.map(_.map(n => nodeWrite.writes(n))),因为你的树不是从树而是从节点构造的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2018-02-12
相关资源
最近更新 更多