用 JQ 去除一层对象嵌套
Posted
技术标签:
【中文标题】用 JQ 去除一层对象嵌套【英文标题】:removing one layer of object nesting with JQ 【发布时间】:2018-06-20 14:23:33 【问题描述】:我一直在修补 JQ 以尝试操纵一些数据。到目前为止,使用我的命令输出以下 JSON:
map(Row: .[] )
| map(select(.Row.ganjalord.latitude | test("SOME_TESTING_CONDITION")?))
输入:
[
"Row":
"ganjalord":
"latitude": "56.237480",
"temp": 44
,
"fighter": "1"
,
"Row":
"ganjalord":
"latitude": "53.237480",
"temp": 42
,
"fighter": "0"
]
如何实现不按行嵌套的示例输出?
样本输出:
[
"ganjalord":
"latitude": "56.237480",
"temp": 44
,
"fighter": "1"
,
"ganjalord":
"latitude": "53.237480",
"temp": 42
,
"fighter": "0"
]
我是否使用简单的选择语句来尝试实现这一目标?
【问题讨论】:
How to create a Minimal, Complete, and Verifiable example 感谢您让我注意到这一点,@glennjackman 我已经更新了 q。 您需要包含 input 以便其他人可以重现该问题。 更新为输入。 @格伦杰克曼 顺便说一句,您在这里尝试做的事情与 OP 在最近的另一个问题***.com/questions/50937290/… 中尝试做的事情非常相似。 【参考方案1】:*
运算符,给定两个字典,合并它们的内容。因此,
jq '[.[] | (. * .Row) | del(.Row)]'
...在给定输入时作为输出发出:
[
"fighter": "1",
"ganjalord":
"latitude": "56.237480",
"temp": 44
,
"fighter": "0",
"ganjalord":
"latitude": "53.237480",
"temp": 42
]
【讨论】:
不管怎样,第一对括号似乎不是必需的 不过,我认为代码的可读性更高。【参考方案2】:如图所示将以下过滤器应用于“输入”,会产生所需的结果:
map( with_entries( if .key == "Row" then .value|to_entries[] else . end) )
理解这一点的关键是with_entries
首先应用to_entries
产生键/值对,然后应用from_entries
。
当然,与基于. * .Row
或. * Row
(或.+.Row
或.Row+.
)的解决方案一样,如果任何提升的键名与顶部重合,上述解决方案将导致一些数据丢失级键名。
【讨论】:
以上是关于用 JQ 去除一层对象嵌套的主要内容,如果未能解决你的问题,请参考以下文章
java-ArrayList中去重复字符串或重复对象LinkedList集合泛型增强for静态导入可变参数asList()方法集合嵌套