如何取下钥匙但保留孩子

How to remove key but keep childs

我是 Scala 的新手,我正在尝试处理 json 文档。 我将 scala 2.13.3 与以下库一起使用:

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.0" % "test"
libraryDependencies += "org.json4s" %% "json4s-native" % "3.6.9"

问题是我找不到一种方法来删除密钥并仍然保留他的 children,如下所示:

这是 json 开头的文档:

{
  "Key": {
    "opt": {
      "attribute1": 0,
      "attribute2": 1,
      "attribute3": 2
    },
    "args": {
      "arg1": 0,
      "arg2": 1,
      "arg3": 2
    }
  }
}

我想删除 "Key" 以仅保留他的 children "opt""args" 以便我得到下面的 Json 文档 :

{
  "opt": {
    "attribute1": 0,
    "attribute2": 1,
    "attribute3": 2
  },
  "args": {
    "arg1": 0,
    "arg2": 1,
    "arg3": 2
  }
}

我的代码

我使用 Json4s 库来操作文档,有一个 transformField 运算符允许对字段 (key, value) => (key, value) 执行操作。所以我试图定义一个空键 "" 但它不能满足我的需要。我还尝试 return 仅关联值,但部分函数不允许它。

这是我的 Scala 代码:

val json: JObject =
  "Key" -> (
    "opt" -> (
      ("attribute1" -> 0) ~
        ("attribute2" -> 1) ~
        ("attribute3" -> 2)
      ) ~
      ("args" -> (
        ("arg1", 0) ~
          ("arg2", 1) ~
          ("arg3", 2)
        )))

val res = json transformField {
  case JField("Key", attr) => attr
}

println(pretty(render(res)))

不幸的是,我不能只使用 transformField("Key", attr) 转换为 attr


有没有一种简单的方法可以从我的 Json 中删除 "Key" 密钥,同时保留其 children "opt""args"

通常最好将 JSON 转换为 Scala 对象,操作 Scala 对象,然后再转换回 JSON。

这是使用 jackson:

时的样子
import org.json4s.{DefaultFormats, Extraction}
import org.json4s.jackson.{JsonMethods, Serialization}

val jsonIn = """
  {
    "Key": {
      "opt": {
        "attribute1": 0,
        "attribute2": 1,
        "attribute3": 2
      },
      "args": {
        "arg1": 0,
        "arg2": 1,
       "arg3": 2
     }
   }
 }
"""

case class Opt(attribute1: Int, attribute2: Int, attribute3: Int)
case class Args(arg1: Int, arg2: Int, arg3: Int)
case class Key(opt: Opt, args: Args)
case class DataIn(Key: Key)

implicit val formats = DefaultFormats

val dataIn: DataIn = Extraction.extract[DataIn](JsonMethods.parse(jsonIn))

val jsonOut: String = Serialization.write(dataIn.Key)

在这种情况下,Scala 处理只是从 DataIn class 中提取 Key 字段。

我在使用 Scala 2.12,所以 YMMV。