创建复杂的Json对象

时间:2013-12-28 17:16:17

标签: json scala

我需要创建一个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的返回值为空?

提前谢谢

1 个答案:

答案 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数组