序列化Scala中的树

序列化Scala中的树,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我有以下类,它是一个树节点: case class Node[A] ( id: Int, data: A, var children: Option[Seq[Node[A]]], var parent: Option[Node[A]] ) 其中id是节点id号,数据表示节点中存储的信息,子节点是子节点列表,父节点是父节点 我想用树生成json,因此我编写了以下隐式val: implicit val nodeWrite : Writes[Node[

我有以下类,它是一个树节点:

case class Node[A] ( id: Int, data: A, var children: Option[Seq[Node[A]]],
                        var parent: Option[Node[A]] )
其中id是节点id号,数据表示节点中存储的信息,子节点是子节点列表,父节点是父节点

我想用树生成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 u或 应用(,,)而不是应用

如何解决这个问题

更新

数据定义为:

case class Data (descrip: String)
更新2

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

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)))
        )
    }
  }
它抛出

类型失配;找到:需要选项[无]: play.api.libs.json.json.JsValueWrapper


x.nodes.map
行中。

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

(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}

添加空处理,您就可以了。

什么是
数据
以及您是如何编译
节点[Data]的。不应用
?查看更新。我无法编译我已经接受了你的答案,但我仍然有一个问题,你能看看更新2吗?谢谢@ps0604在更新中使用了错误的写入。试试这个:
“nodes”->x.nodes.map(u.map(n=>nodeWrite.writes(n)))
,因为树不是从树而是从节点构造的。