我试图像这样嵌套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"
}
}
]
答案 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)
同样的事情,但你有更好的可组合部分。