当存在具有相似名称的嵌套字段时,删除json4s中的顶级字段

时间:2017-02-01 09:07:40

标签: json scala json4s

我想在json结构中删除名为“id”的顶级字段,而不删除名为“id”的所有字段,这在我运行以下代码时会发生:

scala> import org.json4s._
import org.json4s._

scala> import org.json4s.native.JsonMethods._
import org.json4s.native.JsonMethods._

scala> import org.json4s.JsonDSL._
import org.json4s.JsonDSL._

scala> val json = parse("""{ "id": "bep", "foo": { "id" : "bap" } }""")
json: org.json4s.JValue = JObject(List((id,JString(bep)), (foo,JObject(List((id,JString(bap)))))))

scala> json removeField {
     |   case ("id", v) => true
     |   case _ => false
     | }
res0: org.json4s.JValue = JObject(List((foo,JObject(List()))))

知道如何避免删除内部“id”字段吗?

编辑:遗憾的是,我没有能力列出json包含或可能包含的所有可能的顶级对象。

3 个答案:

答案 0 :(得分:0)

removeField似乎适用于整个JSON树。

这仅适用于顶层:

val updated = json match {
  case JObject(l) => JObject(l.filter {
    case (name, _) => name != "id"
  })
}

答案 1 :(得分:-1)

根据答案here,您可以执行以下操作:

val transformedJson2 = json transform { 
  case JField("id", _) => JNothing
  case JField("foo", fields) => fields
}

这绝对不理想,因为您必须使用子元素foo指定所有id元素

答案 2 :(得分:-1)

要做到这一点,而无需了解其他字段的架构:

JObject(
  json.asInstanceOf[JObject].obj.filterNot(_._1 == "id")
)

JObject()。obj是组成对象的字段的平面列表。

这似乎不可能留在json4s DSL中。