使用 JQ 展平分层 JSON 数组
Posted
技术标签:
【中文标题】使用 JQ 展平分层 JSON 数组【英文标题】:Flatten a hierarchical JSON array using JQ 【发布时间】:2020-11-21 10:41:52 【问题描述】:谁能帮我得到正确的 jq 命令来展平下面的例子?我看过其他一些帖子,我正在破解它,但似乎无法得到它。非常感谢任何帮助。
输入:
[
"name": "level1",
"children": [
"name": "level2",
"children": [
"name": "level3-1",
"children": []
,
"name": "level3-2",
"children": []
]
]
]
输出:
[
"displayName": "level1",
"parent": ""
,
"displayName": "level2",
"parent": "level1"
,
"displayName": "level3-1",
"parent": "level2"
,
"displayName": "level3-2",
"parent": "level2"
]
【问题讨论】:
【参考方案1】:这是一个简单的解决方案,不涉及辅助函数,实际上解决了一个更普遍的问题。它基于这样的想法:首先为每个孩子添加一个“父”键,然后使用..
收集所有名称/父对。
所以首先考虑:
[ walk(if type=="object" and has("children")
then .name as $n | .children |= map(.parent = $n)
else . end)
| ..
| select(type=="object" and has("name"))
| displayName: .name, parent
]
这符合要求,除了对于***(无父)对象,它会生成一个 .parent 值null
。这通常比“”更具有 JSON 风格,但如果确实需要空字符串,则只需将上面的最后一行替换为:
| displayName: .name, parent: (.parent // "")
【讨论】:
【参考方案2】:用一个简单的递归函数:
def f: .name as $parent | .children[] | $parent, displayName: .name, f;
[ name: "", children: . | f ]
Online demo
【讨论】:
以上是关于使用 JQ 展平分层 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章