Як перетворити вбудовану (цитовану) рядок json в json


22

Мені знайомий "jq" для розбору json.

Я працюю з однією службою, яка виробляє json відповідь, де одним із властивостей є сам рядок json. Як перетворити вказане значення у дійсну рядок json, щоб потім обробити його jq?

Наприклад, якщо я просто переглядаю звичайний симпатичний json з "jq.", Ось короткий уривок виводу:

"someJsonString": "{\"date\":\"2018-01-08\", ...

Я можу використовувати jq, щоб отримати значення цього властивості, але мені потрібно перетворити цитований рядок у дійсний json, "відмінивши його".

Я гадаю, що я міг би вкласти його в sed, видаливши відкриті та закінчуючи подвійні лапки та видаливши всі косої риски (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'"). Це, здається, працює, але це не здається найбільш надійним рішенням.

Оновлення :

Щоб бути трохи зрозумілішим щодо того, що я роблю, ось кілька схильних зразків, які показують, що я спробував:

% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...

Оновлення :

Ось цілком окремий приклад:

% cat stuff.json | jq .
{
  "stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"

Оновлення :

Якщо я спробував обробити останній висновок реальним виразом jq, він робить щось подібне:

% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)

Якщо ви використовуєте jqдля отримання лише значення властивості рядка, це повертає його без нагляду? Якщо так, то просто перекачайте свіже jq.
— DopeGhoti

Ні, це не повертає його без нагляду. В тім-то й річ.
— Девід М. Карр

Як щодо echo $(jq statement here)?
— DopeGhoti

Ні, ніяких змін.
— Девід М. Карр

@ DavidM.Karr, добре, якщо можливо - продовжте свої дані фактичним вирішальним рядком і кінцевим результатом
— RomanPerekhrest

Відповіді:


20

Для цього є rawпрапор

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

Вихідні дані

{"date":"2018-01-08"}

Різниця полягає в тому, що з відповіддю Романа ви гарантовано отримаєте дійсний вихід JSON або повідомлення про помилки, якщо це недійсний JSON.
— Kusalananda

Дійсна точка, але якщо це використовується в автоматизації, я думаю, було б незвично, щоб раптом не було дійсного json виводу. Найзручніша форма буде ідеально прекрасною майже весь час. Однак все ж добре знати про більш точні методи.
— Девід М. Карр

@ DavidM.Karr "незвично, що раптом не має дійсного json виведення" HA! Riiiight. Помилка обробки при автоматизації? Помилки ніколи не трапляться! Навіщо турбуватися!
— Бруно Броноський

Для цього потрібен перехід до іншого jqдля подальшої обробки JSON, тоді як з підходом Романа ви можете продовжувати той самий jqвираз.
— Раман

1
@ cricket_007: спробував це з jq 1.5, і підтвердив, що він не працює: jq -rc '.stuff.date'виробляє jq: error (at <stdin>:0): Cannot index string with string "date". Однак: .stuff | fromjson | .dateпрекрасно працює.
— Раман

26

З функцією jq' fromjson:

stuff.jsonЗміст зразка :

{
  "stuff": "{\"date\":\"2018-01-08\"}"
}

jq -c '.stuff | fromjson' stuff.json

Вихід:

{"date":"2018-01-08"}

Це здається непотрібним.
— Надала
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.