Способ для jq выводить пути таким образом, который сам может читать?

#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;
  

Обратите внимание, что это всегда заключает имена свойств в кавычки. Это не обязательно, но проще, чем пытаться выяснить, действительно ли это необходимо.