Як перетворити вбудовану (цитовану) рядок 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.