Как использовать JQ Wildcard - PullRequest
2 голосов
/ 29 мая 2019

У меня есть следующий JSON:

{  
   "details":{  
      "car": "bmw",
      "addresses":{  
         "ext-118-21-8-0-29":[  
            {  
               "version":4,
               "addr":"89 Psr"
            },
            {  
               "version":6,
               "addr":"56 apT"
            }
         ]
      }
   }
}

Ключ ext-118-21-8-0-29 является динамическим, он изменится в следующий раз, и я не знаю точного значения, поэтому мне нужно использовать подстановочный знак. Мне нужно получить значение ключа addr, где версия 4.

Я ожидаю в качестве вывода 89 Psr

Я попробовал следующее, используя функцию startswith().

jq '.detail.addresses | select(startswith("ext"))'

Но это заканчивается ошибкой.

jq: ошибка (при: 0): для startwith () требуются строковые значения

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

Если, как следует из части вопроса, вы хотите ограничить поиск именами ключей, начинающимися с "ext":

.details.addresses
| to_entries[]
| select(.key|startswith("ext"))
| .value[]
| select(.version == 4)
| .addr

На другом конце спектра вседозволенности:

.details.addresses
| ..
| objects
| select(.version==4)
| .addr
2 голосов
/ 29 мая 2019

Если вас не интересуют ключи в объекте, который вы ищете, вы можете просто найти значения объекта, используя [], которые затем можно отфильтровать до желаемых результатов.

.details.addresses[][] | select(.version == 4).addr

Если, с другой стороны, вы хотите выбрать клавиши с версией 4, вы можете использовать to_entries для этого:

.details.addresses | to_entries[] | select(any(.value[]; .version == 4)).key
0 голосов
/ 29 мая 2019

в качестве альтернативы, вы можете сделать то же самое, используя Unix-утилиту на основе прогулочного пути jtc:

bash $ <file.json jtc -w'[version]:<4>d [-1] [addr]' -qq
89 Psr
bash $ 

прогулочный путь (-w) объясненный аргумент:

  • [version]:<4>d - найти рекурсивно 1-е вхождение числа 4 в области с меткой version
  • [-1] будет обращаться к родителю найденного JSONзапись (на предыдущем шаге)
  • [addr] будет адресовать найденную запись JSON (на предыдущем шаге) по метке addr

-qq - это опция дляотбросьте кавычки вокруг результата (в противном случае он будет отображаться в виде строки JSON - "89 Psr")

Наконец, если вы хотите убедиться, что поиск ограничен записью, ключ которой начинается с ext, используйте затем этот обходной путь: -w'<^ext>L[version]:<4>d[-1][addr]'

  • <..>L суффикс L обеспечивает рекурсивный поиск с заданным RE среди меток.

PS> Раскрытие информации:Я являюсь создателем jtc - оболочки cli для операций JSON

...