как разобрать строку JSON с помощью jq (или других альтернатив)?

Я пытаюсь заставить 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

Я думаю, что я мог бы обновить его, если это необходимо.


person Colin Grogan    schedule 02.02.2016    source источник
comment
Этот вопрос также поможет, если вы ищете: Как удалить строку json с помощью jq?   -  person k0pernikus    schedule 18.10.2017


Ответы (3)


jq имеет для этого встроенный fromjson:

jq '.c | fromjson | .id' myFile.json

fromjson был добавлен в версии 1.4.

person jwodder    schedule 02.02.2016
comment
Спасибо. Это работает. Я приму этот ответ, так как он кажется мне более «идиоматичным». Ваше здоровье. - person Colin Grogan; 02.02.2016
comment
@ColinGrogan, пожалуйста. - person vbence; 20.10.2017
comment
@ColinGrogan: я не вижу причин менять принятый ответ, поскольку в своем вопросе вы четко написали, что использовали версию 1.3 jq, в которой функция fromjson недоступна. Другими словами, даже если этот ответ интересен, он не отвечает на вопрос. - person Casimir et Hippolyte; 20.10.2017
comment
Можно ли использовать это, но для всего файла json (без указания свойства .id)? - person Florian Castelain; 15.03.2019
comment
@FlorianCastelain да, либо опустите это, либо используйте точку: jq 'fromjson | .' myfile, где myfile содержит "{\"key\":1, \"word\":\"cat\"}" - person ; 30.09.2019

Вы можете использовать необработанный вывод (-r), который удалит символы:

jq -r .c myfile.json | jq .id

ДОПОЛНЕНИЕ: Это имеет то преимущество, что работает в jq 1.3 и выше; действительно, он должен работать во всех версиях jq с параметром -r.

person Casimir et Hippolyte    schedule 02.02.2016

Мотивация: вы хотите проанализировать строку JSON — вы хотите экранировать объект JSON, заключенный в кавычки и представленный в виде строкового буфера, и преобразовать его в допустимый объект JSON. Например:

некоторая неэкранированная строка JSON:

"{\"name\":\"John Doe\",\"position\":\"developer\"}"

ожидаемый результат (объект JSON):

{"name":"John Doe","position":"developer"}

Решение. Чтобы экранировать строку JSON и преобразовать ее в действительный объект JSON, используйте инструмент sed в командной строке и используйте выражения регулярных выражений для удаления/замены определенных символов:

cat current_json.txt | sed -e 's/\\\"/\"/g' -e 's/^.//g' -e 's/.$//g'

s/\\\"/\"/g замена всех обратных косых черт и кавычек ( \" ) только на кавычки (")

s/^.//g замена первого символа в потоке на отсутствие символа

s/.$//g замена последнего символа в потоке на отсутствие символа

person avivamg    schedule 04.05.2021