Могу ли я использовать относительный путь или подстановочный знак в 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"]))
Другие вопросы по тегам