代码之家  ›  专栏  ›  技术社区  ›  tjb

使用jq收集树状json对象中沿每条路径的所有根到叶值

  •  1
  • tjb  · 技术社区  · 7 年前

    使用jq收集树状json对象中沿每条路径的所有根到叶的值。对于walk或flatten函数来说,这看起来应该很容易,但是尽管已经提出了一些有用的问题,但我还是搞不清楚。

    我有这个

     {
         "cond1":["a","b","c"],
         "cond2":["a1","b2","c"],
         "cond2":["a","b","c3"]    
     }    
    

    我想要这个

    ["cond1","a"]
    ["cond1","b"]
    ["cond1","c"]
    ["cond2","a1"]
    ["cond2","b2"]
    ["cond2","c"]
    ["cond2":"a"]
    ["cond2":"b"]
    ["cond2":"c3"]
    

    类似问题: https://github.com/stedolan/jq/issues/646 jq - How do I print a parent value of an object when I am already deep into the object's children?

    另外,如果数组不是由[“a”、“b”、“c”]组成的,而是由嵌套对象组成的,那么答案会有什么不同呢,即[“x2”、“x3”]、[“x1”、“x2”]]

    1 回复  |  直到 7 年前
        1
  •  2
  •   peak    7 年前

    回答这两个问题的关键是 paths . 例如,以下过滤器在第一种情况下生成所需的输出:

    paths as $p
    | getpath($p)
    | select(scalars)
    | ($p | map(select(type=="string"))) + [.]
    

    同一个筛选器可以用任何有效的JSON作为输入。将.cond2替换为沿q中所示行的有效嵌套数组,输出将是:

    ["cond1","a"]
    ["cond1","b"]
    ["cond1","c"]
    ["cond2","x2"]
    ["cond2","x3"]
    ["cond2","x1"]
    ["cond2","x2"]