Могу ли я использовать относительный путь или подстановочный знак в JQ
Можно ли использовать относительный путь или имя в JQ, как XPath //?
Или можно использовать подстановочный знак в JQ, как.level1.*. Level3.element?
2 ответа
Вот что ..
фильтр должен был представлять. Использование будет выглядеть так:
.level1 | .. | .level3? .element
Примечание: вы должны использовать ?
в противном случае вы получите ошибки, так как он повторяет объекты, которые не имеют соответствующего свойства.
Два дополнительных момента относительно ответа Джеффа:
(1) Альтернатива использованию ?
это использовать objects
например,
.level1 | .. | objects | .level3.element
(2) Как правило, требуется удалить пустые значения, соответствующие путям, которые НЕ соответствуют указанным конечным ключам. Чтобы исключить ВСЕ пустые значения, можно использовать фильтр: выберите (.!= Null).
С другой стороны, если кто-то хочет сохранить значения NULL, которые отображаются в виде значений, то одной из возможностей является использование paths
следующее:
.level1
| (paths | select( .[-2:] == ["level3", "element"])) as $path
| getpath($path)
(Поскольку paths
создает поток массивов строк, приведенное выше выражение создает поток значений, соответствующих путям, заканчивающимся на.level3.element)
Эквивалентно, но как однострочник:
.level1 | getpath(paths | select(.[-2:] == ["level3","element"]))