如何使用Scala Play库过滤JSLookup / JSObject

时间:2017-02-10 21:14:46

标签: scala playframework

假设我有一些来自我们的API客户端的参数:

val params = (request \ "params")

我想filter他们并删除某些键/值。就像我得到的那样:

{
  "foo": "bar",
  "hello": "world"
}

我想将其过滤到

{
  "foo": "bar"
}

这是我的WIP代码,但是,正如更高级的Scala人可能会马上告诉它,它不起作用。

val params = (request \ "params").get.as[List[JsObject]]

val blacklistedParams = Seq("foo")

val approvedParams = params.filter((param: JsObject) => {
  !blacklistedParams.contains(param)
})

第一行总是失败。我尝试过各种类型的.get.as,但总是会出错。我仍然是Scala的新手,也是一般的类型。

2 个答案:

答案 0 :(得分:0)

我想我想出了办法:

val params = (request \ "params").get.as[Map[String, JsValue]]

val blacklistedParams = Seq("foo")

val approvedParams = params.filter((param) => {
  !blacklistedParams.contains(param._1)
})

我对此方法的唯一烦恼是._1。对于我来说,对于下一个人来说,这是关键词/ val对的关键,这一点并不十分清楚。

答案 1 :(得分:0)

您可以使用val filtered = (request \ "params").as[JsObject] - "hello"

def index = Action{
  val json = Json.obj(
      "params" -> Json.obj(
          "foo" -> "bar",
          "hello" -> "world"))

  val filtered = (json \ "params").as[JsObject] - "hello"         

  Ok(filtered)
}

完整示例:

{
  foo: "bar"
}

输出:

column def