如何取下钥匙但保留孩子
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。
我是 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。