使用circe从json数组中删除密钥

问题描述

我有一个json作为

[
  {
    "a": "a","b": "b","c": "c"
  },{
    "a": "a1","b": "b1","c": "c1"
  }
]

现在,我想删除c的密钥。因此结果将是:

[
  {
    "a": "a","b": "b"
  },"b": "b1"
  }
]

我正在使用circe,到目前为止,我所做的是:

parse(entityAs[String]) match {
  case Right(value) =>
    val json = value.hcursor
    val result = json.downArray.downField("c").delete
    println(">>>>>>>>>>>>>>>>>")
    println(result.right.as[List[Json]])
         
  case Left(_) =>
}

此行有问题

val result = json.downArray.downField("c").delete

删除密钥c然后使用circe将其转换回json列表的正确行是什么?

解决方法

delete返回一个光标,该光标位于删除元素的位置。您想要返回整个文档,可以使用top返回顶部。您将取回修改后的文档。给定

val doc = parse(entityAs[String])

通过

到达顶部
doc.hcursor.downArray.downField("c").delete.top

会给你

Some([
  {
    "a" : "a","b" : "b"
  },{
    "a" : "a1","b" : "b1","c" : "c1"
  }
])

但是据我了解,您也希望删除下一个“ c”。那是

doc.hcursor.downArray.downField("c").delete.right.downField("c").delete.top

或者,将其全部删除

def removeCs(element: ACursor): ACursor = {
  val deleted = element.downField("c").delete
  val focus = deleted.success.getOrElse(element)
  focus.right.success match {
    case Some(next) => removeCs(next)
    case None => focus
  }
}

removeCs(doc.hcursor.downArray).top