Використовуйте 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 для заміни всіх символів втечі ( \":\", \",\"і \"), але це сумбурно, я думаю, для цього є вбудований спосіб jq?

Дякую!

редагувати: Також доступна тут версія 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де "{\"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.