【问题标题】:Build string from variable-depth nested JSON values从可变深度嵌套 JSON 值构建字符串
【发布时间】:2017-07-30 19:55:21
【问题描述】:

我正在尝试跟踪树样式 JSON 对象中的所有分支,以从每个分支创建一个长的串联字符串。子节点的数量和每个节点的最大深度是未知的,因此必须将结果推广到任意数量。

我正在使用的数据类似于以下内容:

{
    "name":"root",
    "children": [
        {
            "name":"foo",
            "children":[
                {
                    "name":"bar",
                    "children":[]
                },
                {
                    "name":"baz",
                    "children":[]
                }
            ]
        },
        {
           "name":"zoo",
            "children": [
                {
                    "name":"zar",
                    "children": [
                        {
                            "name":"zaz",
                            "children": []
                        }   
                    ]
                }
            ]
        }
    ]
}

我接近this jqplay example

您可以在只有一个孩子的幼稚情况下看到这有效。我最困惑的地方是如何在多个孩子的情况下“重置”父母。而不是递归
root -> foo -> bar -> baz
我想要
root -> foo -> bar
root -> foo -> baz

上述 jqplay 的所需输出:
"root/foo/bar" "root/foo/baz" "root/zoo/zar/zaz"

我更喜欢纯 jq 解决方案,一般 Bash 解决方案也可以。

【问题讨论】:

  • 非常问得好!

标签: json recursion tree jq recursive-datastructures


【解决方案1】:

由于您的数据结构是递归的,因此这里需要递归辅助函数:

def flat:
  [.name] + (.children[] // {} | if has("name") then flat else [] end);


flat | join("/") 

根据您的输入,使用jq -r 的输出将是:

root/foo/bar
root/foo/baz
root/zoo/zar/zaz

【讨论】:

    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 2016-07-19
    • 2014-02-24
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多