【问题标题】:Create complex Json Object创建复杂的 Json 对象
【发布时间】:2013-12-28 17:16:17
【问题描述】:

我需要创建一个 json 对象,我使用 Scala 的 play-json 库。

我有这个代码:

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

提前谢谢你

【问题讨论】:

标签: json scala


【解决方案1】:

你应该用+:=替换:+(因为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 - 您应该使用前置 - +:+:=

替代解决方案:Play 中有Json.writes(和Json.reads),因此您可以创建一个类并将其转换为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" : [ ]
//   } ]
// }

另外:你的代码中有一个错误:你应该用func1替换Json.arr(func1)Json.arr(func1)创建一个数组数组,因为func1已经返回了一个json数组。

【讨论】:

  • @faster2b:请注意,您不必使用 Json.obj - 请参阅我的回答中的更新。
  • @faster2b:您应该删除Json.arr,请参阅我的回答中的更新。
  • @faster2b:我刚刚测试了case class 代码 - 工作正常。结果:{"name":"father","nodeid":1,"children":[{"name":"child1","nodeid":2,"children":[]},{"name":"child2","nodeid":3,"children":[]}]}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多