从Scala中的JsValue中删除一个键

时间:2014-07-31 18:10:41

标签: scala playframework-2.0

这可能是一个非常简单的问题,但我找不到干净/可行的解决方案。 我只想从我拥有的json对象中删除一个字段。 假设我有:

val body:Option[JsValue] = request.body.asJson

身体看起来像:

{
     "url": "www.google.com",
     "id":  "123",
     "count" : 1,
     "label" : "test"  
 }

我想从中删除字段“id”。

我已阅读http://www.playframework.com/documentation/2.1.1/ScalaJsonTransformers案例#6,但遗憾的是无法完全理解它。 (我对Scala和函数式编程很陌生)

谢谢!

3 个答案:

答案 0 :(得分:20)

这可以JsObject完成,扩展JsValue

body.as[JsObject] - "id"

答案 1 :(得分:2)

您可以使用带有as[JsObject]符号的as Method -。喜欢下面。

body.as[JsObject] - "id"

下面逐步详细说明。让我们看一下自定义对象。

val json: JsValue = JsObject(Seq(
      "error" -> JsBoolean(false),
      "result" -> JsNumber(calcResult),
      "message" -> JsString(null)
    ))

可以通过as方法选择并删除“ - ”符号。

/* Removing Message Property and keep the value in successResult Variable */
val successResult = json.as[JsObject] - "message"

在Scala中查看Body Parser以了解选择显式体解析器,组合体解析器和编写自定义体解析器。

答案 2 :(得分:2)

当我想从json对象中删除一个嵌套字段时,我遇到了这个问题,由于减法不适用于嵌套字段,因此我添加了最终使用的解决方案。

要从JsObject中删除字段,可以使用prune删除该字段的整个路径。

对于上面的示例-

val p = JsPath \ "id"
val res = p.prune(body.as[JsObject]).get

如果您有这样的嵌套对象-

{
     "url": "www.google.com",
     "id":  {"first": "123", "second": "456"}
     "count" : 1,
     "label" : "test"  
 }

您可以创建更具体的路径-

val p = JsPath \ "id" \ "second"
val res = p.prune(body.as[JsObject]).get