JQ: доступ к элементу независимо от того, сколько уровней глубоко - PullRequest
2 голосов
/ 06 марта 2019

Учитывая файл test.json

{
  "file": {
    "id": "123456789",
    "name": "137.txt"
  },
  "lines": 219,
  "characters": 2456
}

Я бы хотел получить доступ к элементу name, используя JQ из командной строки.

Ввод jq .file.name test.json производит 137.txt. Отлично!

К сожалению, наша реальная структура json намного больше, и ввод полного пути элемента может быть болезненным.

Возможно ли получить значение name без ввода полного пути? Что-то вроде jq *.name test.json с * подстановочным знаком?

Заранее спасибо за помощь!

Olaf

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Один из способов - выполнить глубокую рекурсию с помощью .., чтобы получить как можно глубже, и , если значение присутствует, а не NULL, как

jq '.. | .name? | select(. != null)'
0 голосов
/ 06 марта 2019

, хотя вопрос был специфичным для jq, позвольте мне предложить альтернативный способ, используя утилиту unix: jtc.jtc выполняет рекурсивный поиск по умолчанию, поэтому легко выбрать name:

bash $ <file.json jtc -w'<name>l'
"137.txt"
bash $ 
  • l в конце пути прохождения инструктирует выполнять поиск только среди меток (ключей)(в противном случае, по умолчанию будут выполняться поиск только по строковым значениям)

путь обхода (-w...) может быть расширен для выбора любого родителя из найденных элементов, например:

bash $ <file.json jtc -w'<name>l [-1]'
{
   "id": "123456789",
   "name": "137.txt"
}
bash $
  • [-1] будет обращаться к непосредственному родителю, [-2] - к родительскому элементу родителя и т. Д.

и снова копать найденного родителя (либо с помощью поиска, либочерез подписку, как показано ниже любое количество раз):

bash $ <file.json jtc -w'<name>l [-1] [id]'
"123456789"
bash $ 

jtc руководство пользователя можно найти здесь: https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md

...