嵌套json - 播放2.3

时间:2014-08-20 20:10:45

标签: json scala playframework playframework-2.3

我试图像这样嵌套json:

case class Foo(id:Int, a:String, b:String)

def barJson =
  Json.obj("hello" -> "hi")

def getFooJson =
  Json.obj {
    "foos" -> Json.arr {
      fooTable.list.map { foo =>
        Json.toJson(foo) + barJson
      }
    }
  }

但是我收到了这个错误:

type mismatch;
[error]  found   : play.api.libs.json.JsObject
[error]  required: String

我在这里做错了什么?我该怎么解决?我追求的结果是这样的:

"foos":[
    {
      "a":"hi", 
      "b":"bye", 
      "bar": {
        "hello": "bye"
      }
    }, 
    {
      "a":"hi2", 
      "b":"bye2", 
      "bar": {
        "hello": "bye"
      }
    }
]

1 个答案:

答案 0 :(得分:1)

问题是添加字段的+方法位于JsObject,而Json.toJson(foo)只是JsValue。如果您确定Writes Foo始终生成对象,则可以使用.as[JsObject]

def getFooJson =
  Json.obj {
    "foos" -> Json.arr {
      fooTable.list.map { foo =>
        Json.toJson(foo).as[JsObject] + ("bar" -> barJson)
      }
    }
  }

另请注意,如果您希望JSON符合预期结果,则需要为+提供键值对。

对于它的价值,我可能会写下如下内容:

val fooTableWrites = Writes.list(
  JsPath.write[Foo].transform(_.as[JsObject] + ("bar" -> barJson))
).transform(arr => Json.obj("foos" -> arr))

def getFooJson = fooTableWrites.writes(fooTable.list)

同样的事情,但你有更好的可组合部分。