如何将嵌入(引用)的 json 字符串转换为 json

如何将嵌入(引用)的 json 字符串转换为 json

我熟悉用于解析 json 的“jq”。

我使用一项生成 json 响应的服务,其中属性之一本身就是一个 json 字符串。如何将该引用值转换为有效的 json 字符串,以便我可以使用 jq 处理它?

例如,如果我只是查看“jq .”中的简单打印的 json,以下是输出的简短摘录:

"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)

答案1

jqfromjson功能:

样本stuff.json内容:

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

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

输出:

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

答案2

有一个raw标志用于此

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

输出

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

相关内容