解析递归特征playsafe json scala
我正在使用play-json_2.11,并尝试递归地解析一些case类解析递归特征playsafe json scala,json,scala,parsing,typesafe,Json,Scala,Parsing,Typesafe,我正在使用play-json_2.11,并尝试递归地解析一些case类 sealed trait Tree case class Node(value: Float, child: Seq[Tree]) extends Tree case class Leaf(leaf: Float) extends Tree 因此,基本上,每个节点都包含一个值和一个树列表(可以是节点或叶) 因此,我在case类的伴生对象中定义隐式读取器。在名为树的对象中有一个 object Node { impli
sealed trait Tree
case class Node(value: Float, child: Seq[Tree]) extends Tree
case class Leaf(leaf: Float) extends Tree
因此,基本上,每个节点都包含一个值和一个树列表(可以是节点或叶)
因此,我在case类的伴生对象中定义隐式读取器。在名为树的对象中有一个
object Node {
implicit val reader = Json.reads[Node]
}
object Leaf {
implicit val reader = Json.reads[Leaf]
}
object Tree {
implicit val treeReads =
__.read[Node].map(x => x:Tree) orElse __.read[Leaf].map(x => x:Tree)
}
由于解析器相互引用,我无法定义它们,并出现以下错误:
ScalaFiddle.scala:9: error: No instance of play.api.libs.json.Reads is available for scala.Seq[ScalaFiddle.Tree] in the implicit scope (Hint: if declared in the same file, make sure it's declared before)
implicit val reader = Json.reads[Node]
在这种情况下,如何解析树?(我不需要它是一种特殊的特质)
这是我试过的小提琴
我的输入是这样的json
{
"value": 1.0,
"child": {
"leaf": 2.0
}
}
我想把它解析成
Node(1.0, Leaf(2.0))
这就是你需要的
import play.api.libs.json._
import play.api.libs.functional.syntax._
sealed trait Tree
case class Node(value: Float, child: Tree) extends Tree
object Node {
implicit lazy val reader = Json.reads[Node]
}
case class Leaf(leaf: Float) extends Tree
object Leaf {
implicit lazy val reader = Json.reads[Leaf]
}
object Tree {
implicit lazy val treeReads: Reads[Tree] =
__.lazyRead(Node.reader).map(x => x:Tree) orElse __.lazyRead(Leaf.reader).map(x => x:Tree)
}
val json: JsValue = Json.parse("""
{
"value": 5.0,
"child": {
"leaf": 7
}
}
""")
println(json)
json.validate[Tree] match {
case s: JsSuccess[Tree] => {
val place: Tree = s.get
println(place)
}
case e: JsError => {
println(e)
}
}
您不需要关联对象中的隐式。。或与此相关的对象:
import play.api.libs.json._
import play.api.libs.functional.syntax._
sealed trait Tree
case class Node(value: Double, child: Tree) extends Tree
case class Leaf(leaf: Double) extends Tree
val json: JsValue = Json.parse("""
{
"value": 1.0,
"child": {
"leaf": 2.0
}
}
""")
implicit val nReader = Json.reads[Node]
implicit val lReader = Json.reads[Leaf]
implicit lazy val treeReads: Reads[Tree] =
__.lazyRead(nReader).map(x => x:Tree) orElse __.lazyRead(lReader).map(x => x:Tree)
json.validate[Tree] match {
case s: JsSuccess[Tree] => {
val place: Tree = s.get
println(place)
}
case e: JsError => {
println(e)
}
}
最新版本的play json直接支持json.format
macro中的密封族,但不确定节点和Leaf
ReadsYeah是否需要懒散。可能不会为树添加隐式写入
的格式是什么?我有一个用例,需要读和写。