创建复杂的Json对象

快2b

我需要创建一个json对象,我将play-json lib用于Scala。

我有以下代码:

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的返回值为空?

先感谢您

塞尼亚

此时应更换:++:=(因为默认的实现SeqList你不应该使用:+=)。

Seq是一成不变的。:+您共创新局面Seq

因此,您应该使用nodes = nodes :+ Json.obj(...)代替nodes :+ Json.obj(...)或,nodes :+= Json.obj(...)(请参阅此答案的最后一部分)。

你可以使用可变集合喜欢mutable.Seq+=操作:nodes += Json.obj(...)

我希望以这种方式创建一个集合:

nodes = Seq(
  Json.obj(...),
  Json.obj(...)
)

注意的默认实现SeqList和append( :+操作上List是非常低效的-你应该使用预先准备-+:+:=

替代解决方案:中有Json.writes(和Json.readsPlay,因此您可以创建一个类并将其转换为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)func1Json.arr(func1)创建一个数组数组,因为func1已经返回了一个json数组。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章