#path #jq
#путь #jq
Вопрос:
Есть ли способ создать jq
пути вывода таким образом, чтобы сам мог читать?
Пример ввода:
{
"foo": [{
"bar": 2,
"bor": 3
}]
}
Выведите местоположение и значение «bar», например:
jq -c 'tostream | select(.[0]|index("bar"))'
[["foo",0,"bar"],2]
Есть ли способ вместо этого вывести путь в jq
формате выбора пути, т.Е. .foo[0].bar
?
Ответ №1:
jq может считывать пути, указанные в виде массивов JSON. Смотрите, в частности getpath
, и setpath
. fromstream
также считывает пути в формате массива.
Ответ №2:
Насколько я знаю, нет встроенного способа сделать это, но для развертывания реализации не должно потребоваться много времени.
Есть только три случая, о которых вам нужно беспокоиться: когда путь пуст, путь содержит строку, а путь содержит число.
Если он пустой, он просто ссылается на сам ввод. Если это строка, это свойство объекта. Если это число, это индекс в массиве.
Итак, вы могли бы использовать это:
def to_expression($path): $path |
if length == 0
then "."
else map(
if type == "string"
then "."(.)""
elif type == "number"
then "[(.)]"
else
error("unexpected path type: (type)")
end
) | add
end;
Обратите внимание, что это всегда заключает имена свойств в кавычки. Это не обязательно, но проще, чем пытаться выяснить, действительно ли это необходимо.