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


22

我熟悉用于解析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)

如果jq用于获取string属性的值,它是否将其返回未转义的状态?如果是这样,只需将其放入新鲜的。jq
DopeGhoti

不,它不会使它返回未转义的状态。这才是重点。
David M. Karr

怎么echo $(jq statement here)
DopeGhoti

不,没有变化。
大卫·卡尔

@ DavidM.Karr,好的,如果可能的话-使用实际的关键字符串和最终结果扩展您的输入
-RomanPerekhrest

Answers:


20

有一个raw标志

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

输出量

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

区别在于,使用Roman的答案,可以确保您获得有效的JSON输出,如果不是有效的JSON,则可以获取错误消息。
Kusalananda

有效点,但是如果在自动化中使用它,我认为突然没有有效的json输出将是不寻常的。最方便的形式几乎可以随时使用。但是,了解更精确的方法仍然很好。
大卫·卡尔

@ DavidM.Karr“异常突然没有有效的json输出”哈!权。自动化中的错误处理?错误永远不会发生!何必!
布鲁诺·布鲁诺斯基

这需要传递到另一个jq进行进一步的JSON处理,而使用Roman的方法,您可以继续相同的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

具有jqfromjson功能:

样本stuff.json内容:

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

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

输出:

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

这似乎是不必要的。提供了替代答案
cricket_007
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.