Как преобразовать встроенную (цитируемую) строку 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"}
cricket_007
источник
Разница в том, что с ответом Романа вы гарантированно получите корректный вывод JSON или сообщения об ошибках, если это не валидный JSON.
Кусалананда
Допустимая точка, но если это используется в автоматизации, я думаю, было бы необычно внезапно не иметь действительный вывод 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«S fromjsonфункции:

Пример stuff.jsonсодержимого:

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

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

Выход:

{"date":"2018-01-08"}
RomanPerekhrest
источник
Это кажется ненужным. Предоставлен альтернативный ответ
cricket_007