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

how to parse a JSON String with jq (or other alternatives)?

我正在尝试让 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 替换所有转义字符(\":\"\",\"\"),但这很麻烦,我想 [= 中内置了一种方法13=] 要做到这一点?

谢谢!

编辑: 此外,此处可用的 jq 版本为:

$ jq --version
jq version 1.3

我想我可以根据需要更新它。

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 字符串 - 你想转义一个用引号括起来并表示为字符串缓冲区的 JSON 对象,并将其转换为有效的 JSON 对象。例如:

一些JSON未转义字符串:

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

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

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

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

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

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

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

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