Скрипт Bash для извлечения всех определенных значений ключей из неструктурированного файла JSON - PullRequest
0 голосов
/ 25 апреля 2019

Я пытался извлечь все значения из определенного ключа в файле JSON ниже.

{
  "tags": [
    {
      "name": "xxx1",
      "image_id": "yyy1"
    },
    {
      "name": "xxx2",
      "image_id": "yyy2"
    }
  ]
}

Я использовал приведенный ниже код для получения значений ключа image_id.

echo new.json | jq '.tags[] | .["image_id"]'

Я получаю сообщение об ошибке ниже.

parse error: Invalid literal at line 2, column 0

Я думаю, что либо файл JSON имеет неправильный формат, либо команда echo для вызова файла Json неверна.

Учитывая вышеприведенный ввод, мой предполагаемый / желаемый вывод:

yyy1
yyy2

Что нужно исправить, чтобы это произошло?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019

также вы можете попробовать альтернативный подход к вашему запросу - с помощью инструмента Unix Walk-Path для JSON: jtc.При этом ваш запрос будет выглядеть так:

bash $ <new.json jtc -w'[tags][:][image_id]'
"yyy1"
"yyy2"
bash $ 

Однако ваш new.json не является неструктурированным, напротив, он хорошо структурирован.если ваш new.json действительно был нерегулярным (неструктурированным), то следующий запрос будет работать лучше:

bash $ <new.json jtc -w'<image_id>l:'
"yyy1"
"yyy2"
bash $ 
0 голосов
/ 25 апреля 2019
  1. Ваш фильтр .tags[] | .["image_id"]

допустимо, но может быть сокращено до:

.tags[] | .image_id

или даже:

.tags[].image_id
  1. Если вы хотите, чтобы значения, связанные с ключом "image_id", где бы этот ключ ни встречался, вы можете использовать:

    .. | objects | select(has("image_id")) | .image_id

Или, если вы не против выбросить ложные и нулевые значения:

.. | .image_id? // empty
0 голосов
/ 25 апреля 2019

При запуске:

echo new.json | jq '.tags[] | .["image_id"]'

... строка new.json - не содержимое файла с именем new.json - подается на jqsdin, и поэтому он пытается проанализировать текст JSON.

Вместо этого запустите:

jq -r '.tags[] | .["image_id"]' <new.json

... для непосредственного открытия new.jsonподключен к стандартному вводу jq (и, с -r, чтобы избежать добавления нежелательных кавычек в выходной поток).

...