Используйте jq для анализа строки JSON


87

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

Думаю, я могу обновить его, если потребуется.


Этот вопрос также помогает, если вы ищете: «Как отключить экранирование строки json с помощью jq?»
— k0pernikus

Ответы:


165

jq имеет fromjsonвстроенную функцию для этого:

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

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


2
Спасибо. Это работает. Я приму этот ответ, поскольку я считаю его более «идиомайтным». Ура.
— Колин Гроган,

@ColinGrogan, пожалуйста.
— vbence

@ColinGrogan: Я не вижу причин менять принятый ответ, поскольку вы четко написали в своем вопросе, что использовали версию 1.3 jq, в которой эта fromjsonфункция недоступна. Другими словами, даже если этот ответ интересен, он не отвечает на вопрос.
— Casimir et Hippolyte

Можно ли использовать это, но для всего файла json (без указания свойства .id)?
— Флориан

1
@FlorianCastelain да, либо опустите его, либо используйте точку:, jq 'fromjson | .' myfileгде myfile содержит"{\"key\":1, \"word\":\"cat\"}"

41

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.