Сбор всех значений от корня до листа по каждому пути в древовидном объекте json с помощью JQ

Сбор всех значений от корня до листа по каждому пути в древовидном объекте json с помощью JQ. Кажется, что это должно быть легко с функциями ходьбы или сглаживания, но я не могу понять это, несмотря на некоторые полезные вопросы, которые уже были заданы.

у меня есть это

 {
     "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 - Как мне напечатать родительское значение объекта, когда я уже глубоко в дочерних объектах?

Кроме того, как бы отличался ответ, если бы вместо ["a","b","c"] массив состоял из вложенных объектов, т.е. [["x2","x3"],["x1,"x2"] ]


person tjb    schedule 20.12.2018    source источник


Ответы (1)


Ключом к ответу на оба вопроса является 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"]
person peak    schedule 20.12.2018