如何用 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 个字符
我正在尝试让 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 个字符