json - Play Framework : type mismatch JsValue/JsValueWrapper

标签 json scala playframework

我需要转换这个 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/

相关文章:

c# - DNX 核心 5.0 JwtSecurityTokenHandler "IDX10640: Algorithm is not supported: ' http ://www. w3.org/2001/04/xmldsig-more#hmac-sha25 6'"

scala - 我应该如何避免无意中捕获函数文字中的局部作用域?

scala - 如何使用 resourceGenerators 复制 Scala.js 源映射?

scala - play2 制作一个 Enumeratee 将一个 Promise 转换为另一个 Promise

c# - LINQ .Include() 来自 TPH 继承中子类型的属性

c# - 将大型 Javascript 对象转换为 C# 对象时出现问题

c++ - JSONCPP 没有正确读取文件

scala - 将参数传递给 Scala Map.map 的意外行为

java - 如何在未来刷新实体?

java - Play 2 JPA Oracle - 即使 ebeanEnabled 在 build.scala 中设置为 false,也会出现额外列 'ebean_intercept'