如何使用 jq 解析 json 中编码为字符串的 json

Die*_*des 5 json jq

有什么方法可以在单个命令中使用 jq 解析此 json 吗?我想做这样的事情:jq .key.first。但是,是的,考虑到这key是一个字符串,需要首先解析为 json。

{
  "key": "{\"first\":\"123\",\"second\":\"456\"}"
}
Run Code Online (Sandbox Code Playgroud)

pea*_*eak 11

使用fromjson,例如

\n
jq '.key|fromjson|.first'\n
Run Code Online (Sandbox Code Playgroud)\n

正如评论中指出的,可以通过省略最后一个管道字符来缩写。

\n

一般来说,当一次调用就足够时,最好避免调用 jq 两次。

\n


axi*_*iac 1

有什么方法可以在单个命令中使用 jq 解析此 json 吗?

这取决于您如何定义单个命令。可以使用包含两次调用的管道来完成jq

INPUT='{
  "key": "{\"first\":\"123\",\"second\":\"456\"}"
}'

echo "$INPUT" | jq -r .key | jq .
Run Code Online (Sandbox Code Playgroud)

jq -r .key告诉jq回显 的原始值.key,而不是其 JSON 表示形式(它是一个字符串,通常jq按输入 JSON 中表示的形式输出)。

输出是:

{
  "first": "123",
  "second": "456"
}
Run Code Online (Sandbox Code Playgroud)

第二次调用jq( jq .) 不会对数据执行任何操作;它只是很好地格式化它(如上所示)并着色(如果它不进入终端,它不会为输出着色)。

.key但是,它表明其输入是可以进一步处理的JSON( 的原始值)。例如,您可以使用jq .first代替来获取"123"(编码为 JSON 的字符串)或jq -r .first获取123(原始值)。