我需要转换这个 JSON
{ "matchItem": { "collection": { "fieldName": [ "value1", "value2" ] } } }
到这个 MongoDB 投影:
{ "collection": { "$elemMatch": { "fieldName": "value1", "fieldName": "value2" } }
下面是我的代码:
def toProjection(json: JsValue) = {
json.getOpt(__ \ "matchItem").map { value =>
val obj = value.as[JsObject]
for (key <- obj.keys) { obj.getOpt(__ \ key).map { matchObj =>
for (matchKey <- matchObj.as[JsObject].keys) { matchObj.getOpt(__ \ matchKey).map { items =>
val fields = items.as[Seq[JsValue]].map(item => (matchKey -> item))
seq += key -> Json.obj("$elemMatch" -> Json.obj(fields))
}}
}}
}
if (seq.length > 0) JsObject(seq) else json
}
val json = """{ "matchItem": { "collection": { "fieldName": [ "value1", "value2" ] } } }"""
val proj = toProjection(json)
此代码无法编译,我总是收到以下错误消息:
[error] /home/j3d/Projects/test/app/services/Test.scala:82: type mismatch;
[error] found : Seq[(String, play.api.libs.json.JsValue)]
[error] required: (String, play.api.libs.json.Json.JsValueWrapper)
[error] seq += fieldMaps.fromPublic(key) -> Json.obj("$elemMatch" -> Json.obj(fields))
[error] ^
我有点失落。我知道
Json.obj
是构建 JsObject
的辅助方法实例:JsObject(Seq(
"key1" -> JsString("value1"),
"key2" -> JsString("value2")
...
))
...相当于:
Json.obj("key1" -> "value1", "key2" -> "value2")
在我上面的代码中,
fields
值是 Seq[(String, play.api.libs.json.JsValue)]
......所以我不明白为什么它不起作用。任何帮助将非常感激。
最佳答案
这是解决方案:
def toProjection(json: JsValue) = {
json.getOpt(__ \ "matchItem").map { value =>
val obj = value.as[JsObject]
for (key <- obj.keys) { obj.getOpt(__ \ key).map { matchObj =>
for (matchKey <- matchObj.as[JsObject].keys) { matchObj.getOpt(__ \ matchKey).map { items =>
val fields = items.as[Seq[JsValue]].map(item => (matchKey -> item))
// seq += key -> Json.obj("$elemMatch" -> Json.obj(fields))
seq += key -> Json.obj("$elemMatch" -> JsObject(fields))
}}
}}
}
if (seq.length > 0) JsObject(seq) else json
}
更换
Json.obj(fields)
与 JsObject(fields)
诀窍。我希望它有帮助。
关于json - Play Framework : type mismatch JsValue/JsValueWrapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22159541/