我想在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包含或可能包含的所有可能的顶级对象。
答案 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中。