我需要创建一个json对象,我为Scala使用play-json lib。
我有这段代码:
import play.api.libs.json
import play.api.libs.json._
object Start {
def main(args: Array[String])
{
val GraphDbJson= Json.obj("name"->"father","nodeid"->1,"children"->Json.arr(func1))
println(Json.prettyPrint(GraphDbJson))
}
def func1():JsValue=
{
var JObjChildrenNodes=Seq[JsValue]()
JObjChildrenNodes :+ Json.obj("name"->"child1","nodeid"->2,"children"->Json.arr())
JObjChildrenNodes :+ Json.obj("name"->"child2","nodeid"->3,"children"->Json.arr())
Json.toJson(JObjChildrenNodes)
}
}
,输出为:
{
"name" : "father",
"nodeid" : 1,
"children" : [ [ ] ]
}
如何传递json数组?为什么func1的返回值为空?
提前谢谢
答案 0 :(得分:2)
您应该将:+
替换为+:=
(因为Seq
的默认实现是List
,您不应该使用:+=
。)
Seq
是不可变的。使用:+
,您正在创建新的Seq
。
因此,您应该使用nodes = nodes :+ Json.obj(...)
代替nodes :+ Json.obj(...)
,或仅使用nodes :+= Json.obj(...)
(请参阅this answer的最后一部分)。
您可以将mutable.Seq
变量集合与+=
操作一起使用:nodes += Json.obj(...)
。
我更希望以这种方式创建一个集合:
nodes = Seq(
Json.obj(...),
Json.obj(...)
)
请注意,Seq
的默认实施是List
,:+
上的追加(List
)操作非常inefficient - 您应该使用prepend - {{ 1}}和+:
。
替代解决方案:+:=
中有Json.writes
(和Json.reads
),因此您可以创建一个类并以这种方式将其转换为Play
:
JSON
另外:代码中有错误:您应该用case class MyNode(name: String, nodeid: Int, children: Seq[MyNode] = Nil)
implicit lazy val myNodeWrites = Json.writes[MyNode]
val myNode = MyNode("father", 1, MyNode("child1", 2) :: MyNode("child2", 3) :: Nil)
val graphDbJson = Json.toJson(myNode)
Json.prettyPrint(graphDbJson)
// {
// "name" : "father",
// "nodeid" : 1,
// "children" : [ {
// "name" : "child1",
// "nodeid" : 2,
// "children" : [ ]
// }, {
// "name" : "child2",
// "nodeid" : 3,
// "children" : [ ]
// } ]
// }
替换Json.arr(func1)
:func1
创建一个数组数组,因为Json.arr(func1)
已经返回一个json数组