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

Dav*_*arr 44 json jq

我熟悉解析json的“jq”。

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

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

"someJsonString": "{\"date\":\"2018-01-08\", ...
Run Code Online (Sandbox Code Playgroud)

我可以使用 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\",...
Run Code Online (Sandbox Code Playgroud)

更新

这是一个完全独立的示例:

% 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\"}"
Run Code Online (Sandbox Code Playgroud)

更新

如果我尝试使用真正的 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)
Run Code Online (Sandbox Code Playgroud)

Rom*_*est 50

Withjqfromjson功能:

示例stuff.json内容:

{
  "stuff": "{\"date\":\"2018-01-08\"}"
}
Run Code Online (Sandbox Code Playgroud)
jq -c '.stuff | fromjson' stuff.json
Run Code Online (Sandbox Code Playgroud)

输出:

{"date":"2018-01-08"}
Run Code Online (Sandbox Code Playgroud)

  • 它实际上很好,因为您可以直接执行诸如`jq -c '.stuff | 之类的操作。来自json | .date' stuff.json` 例如;如果没有 `fromjson` 函数,你就无法做到这一点 (3认同)

One*_*eer 37

有一个raw标志

    -r      output raw strings, not JSON texts;
Run Code Online (Sandbox Code Playgroud)

jq -rc .stuff stuff.json
Run Code Online (Sandbox Code Playgroud)

输出

{"date":"2018-01-08"}
Run Code Online (Sandbox Code Playgroud)

  • @cricket_007:用 jq 1.5 尝试过,并确认它不起作用:`jq -rc '.stuff.date'` 产生 `jq: error (at <stdin>:0): Cannot index string with string "date" `. 但是:`.stuff | 来自json | .date` 工作正常。 (3认同)
  • 这需要管道到另一个“jq”以进行进一步的 JSON 处理,而使用 Roman 的方法,您可以继续相同的“jq”表达式。 (2认同)