Я пытаюсь jq
разобрать структуру JSON, например:
{
"a" : 1,
"b" : 2,
"c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}
То есть элемент в JSON - это строка с экранированным json.
Итак, у меня есть что-то вроде
$ jq [.c] myFile.json | jq [.id]
Но это сбой с jq: error: Cannot index string with string
Это потому, что вывод .c - это строка, а не JSON. Как мне заставить jq проанализировать эту строку?
Мое первоначальное решение - использовать sed для замены всех escape-символов ( \":\"
, \",\"
и \"
), но это беспорядочно, я предполагаю, что есть встроенный способ jq
сделать это?
Благодарность!
edit: Кроме того, здесь доступна версия jq:
$ jq --version
jq version 1.3
Думаю, я могу обновить его, если потребуется.
Ответы:
jq имеет
fromjson
встроенную функцию для этого:jq '.c | fromjson | .id' myFile.json
fromjson
был добавлен в версии 1.4.источник
fromjson
функция недоступна. Другими словами, даже если этот ответ интересен, он не отвечает на вопрос.jq 'fromjson | .' myfile
где myfile содержит"{\"key\":1, \"word\":\"cat\"}"
Вы можете использовать необработанный вывод (-r), который отключит экранирование символов:
jq -r .c myfile.json | jq .id
ДОПОЛНЕНИЕ: это имеет то преимущество, что работает в jq 1.3 и выше; действительно, он должен работать во всех версиях jq, у которых есть опция -r.
источник