jq: error Невозможно проиндексировать строку со строкой. Как проанализировать файл json со значениями переменных объекта с помощью jq - PullRequest
0 голосов
/ 07 марта 2019

У меня есть файл json, который выглядит следующим образом:

[
{"start": "xxx", "final": {"name": "uuu", "content": "{'Date': 'Thu, 07 Mar 2019', 'Type': 'text'}"}},
{"start": "yyy", "final": {"name": "nnn", "content": "{'Date': 'Thu, 07 Mar 2019'}"}}
]

"final" содержит объект, который содержит две клавиши: name и content.Значение content является объектом.Он может быть пустым и содержать разные ключи.

Однако мне интересны определенные ключи, если они появились в content.В этом примере, если включен «Тип», я хочу его проанализировать.Если нет, просто вставьте «not found».

Когда я запускаю эту команду jq, я получаю эту ошибку:

jq: error (at <stdin>:4): Cannot index string with string "Type"

Это потому, что второй объект в моем файле json делаетне содержит Type.

Есть ли решение этой проблемы?

cat test.json | jq -r '.[] | "\(.start),\(.final["name"]),\(.final["content"]["Type"])"'
jq: error (at <stdin>:4): Cannot index string with string "Type"

1 Ответ

1 голос
/ 07 марта 2019

Поскольку значение поля "content" не может быть обработано напрямую с помощью fromjson, следующее решение сначала переводит одинарные кавычки в экранированные двойные кавычки, а затем применяет ваш фильтр:

map(.final.content |= (gsub("'";"\"") | fromjson))
| .[]
| "\(.start),\(.final["name"]),\(.final["content"]["Type"])"

Вывод с использованием параметра командной строки -r:

xxx,uuu,text
yyy,nnn,null

CSV

Если вы хотите корректный вывод CSV, вероятно, было бы лучше использовать фильтр @csv:

.[]
| .final.content |= (gsub("'";"\"") | fromjson)
| [.start, .final["name"], .final["content"]["Type"]]
| @csv

Вызов

При наличии в файле программы jq, например, program.jq, соответствующий вызов будет выглядеть следующим образом:

jq -r -f program.jq test.json

Вариация

Если вы хотите обрабатывать пропущенные значения специально, вы можете использовать //, например, следующим образом:

(.final["content"]["Type"] // "NA")

Обработка встроенных двойных кавычек

.final.content |= (gsub("\"";"\\\"") | gsub("'";"\"") | fromjson)
...