【问题标题】:Removing top level field in json4s when nested field with similar name exists当存在具有相似名称的嵌套字段时,删除 json4s 中的顶级字段
【发布时间】:2017-02-01 09:07:39
【问题描述】:

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

【问题讨论】:

  • 好吧,您可以在这里使用这种方法并选择所有不是第一个的 id 字段,以便它们保持不变:stackoverflow.com/questions/14216069/…
  • @nmat 不确定我是否关注?这个答案是关于在不触及外部字段的情况下删除嵌套字段,这很好。我想删除一个顶级字段而不触及其他可能嵌套的字段。

标签: json scala json4s


【解决方案1】:

removeField 似乎适用于整个 JSON 树。

这仅适用于顶级:

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

【讨论】:

    【解决方案2】:

    根据here 的回答,您可以这样做:

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

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

    【讨论】:

    • 好的,我明白了。感谢你的回答。虽然输入 json 是动态的,但我无法控制它包含的所有字段。
    【解决方案3】:

    要做到这一点,无需知道其他字段的架构:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多