如何使用 jq (或其他替代方法)解析 JSON 字符串?

我试图让 jq解析一个 JSON 结构,比如:

{
"a" : 1,
"b" : 2,
"c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}

也就是说,JSON 中的一个元素是一个包含转义 JSON 的字符串。

所以,我有一些关于 $ jq [.c] myFile.json | jq [.id]

但是它与 jq: error: Cannot index string with string一起崩溃了

这是因为. c 的输出是一个字符串,而不是更多的 JSON。 如何让 jq 解析这个字符串?

我最初的解决方案是使用 sed 来替换所有的转义字符(\":\"\",\"\") ,但是这很混乱,我假设有一种内置在 jq中的方法来做到这一点?

谢谢!

编辑: 此外,这里提供的 jq 版本是:

$ jq --version
jq version 1.3

如果需要的话,我可以更新一下。

67060 次浏览

Jq 内置了 fromjson:

jq '.c | fromjson | .id' myFile.json

fromjson是在1.4版本中添加的。

可以使用取消转义字符的原始输出(- r) :

jq -r .c myfile.json | jq .id

补充: 这样做的优点是它可以在 jq 1.3及以上版本中工作; 实际上,它应该可以在具有-r 选项的 jq 的每个版本中工作。

动机 : 您希望解析 JSON 字符串-您希望转义一个用引号包装并表示为 String 缓冲区的 JSON 对象,并将其转换为有效的 JSON 对象。例如:

一些 未转义字符串:

"{\"name\":\"John Doe\",\"position\":\"developer\"}"

预期的结果(一个 JSON 对象) :

{"name":"John Doe","position":"developer"}

解决方案 : 为了转义 JSON 字符串并将其转换为有效的 JSON 对象,请使用命令行中的 sed工具并使用正则表达式删除/替换特定字符:

cat current_json.txt | sed -e 's/\\\"/\"/g' -e 's/^.//g' -e 's/.$//g'

s/\\\"/\"/g将所有反斜杠和引号(\")仅替换为引号(")

s/^.//g将流中的第一个字符替换为无字符

s/.$//g将流中的最后一个字符替换为无字符