使用 jq 在 json 中提取 json
extracting json inside json with jq
我经常发现自己想用 jq
命令解析 json,但是 json 中的值之一是 json 的转义字符串。
例如如果我像这样使用 python 生成数据:
import json
inner = {'a': 'b'}
outer = {'x': json.dumps(inner)}
json.dumps(outer)
我得到:
{"x": "{\"a\": \"b\"}"}
如何使用 jq
命令获得 "b"
?
$ echo '{"x": "{\"a\": \"b\"}"}' | jq .x
"{\"a\": \"b\"}"
好的,这是第一步。
但结果不是 json 字典。是一个字符串,需要转义解析成json.
jq .x.a
抛出错误:jq: error (at <stdin>:1): Cannot index string with string "a"
有没有我可以添加到 jq
的参数来将两个 jq
步骤链接在一起?
或者我可以使用其他命令吗?
例如
echo '{"x": "{\"a\": \"b\"}"}' | jq .x | jq --some-argument .a
或
echo '{"x": "{\"a\": \"b\"}"}' | jq .x | something-else | jq .a
下面的技巧:
echo '{"x": "{\"a\": \"b\"}"}' | jq -r .x | jq .a
这里的 -r
步骤确保输出是 原始字符串 ,而不是 JSON 文本。因此:
"{\"a\": \"b\"}" -> {"a": "b"},
此“原始字符串”随后可以作为 jq .a
的 JSON 输入,返回 "b"
(或与 -r
一起使用时的 b
旗帜)。
编辑:调用jq
两次并不理想(感谢@peak),之前的命令可以合并到这个oneliner
| jq -r '.x|fromjson.a'
我经常发现自己想用 jq
命令解析 json,但是 json 中的值之一是 json 的转义字符串。
例如如果我像这样使用 python 生成数据:
import json
inner = {'a': 'b'}
outer = {'x': json.dumps(inner)}
json.dumps(outer)
我得到:
{"x": "{\"a\": \"b\"}"}
如何使用 jq
命令获得 "b"
?
$ echo '{"x": "{\"a\": \"b\"}"}' | jq .x
"{\"a\": \"b\"}"
好的,这是第一步。 但结果不是 json 字典。是一个字符串,需要转义解析成json.
jq .x.a
抛出错误:jq: error (at <stdin>:1): Cannot index string with string "a"
有没有我可以添加到 jq
的参数来将两个 jq
步骤链接在一起?
或者我可以使用其他命令吗?
例如
echo '{"x": "{\"a\": \"b\"}"}' | jq .x | jq --some-argument .a
或
echo '{"x": "{\"a\": \"b\"}"}' | jq .x | something-else | jq .a
下面的技巧:
echo '{"x": "{\"a\": \"b\"}"}' | jq -r .x | jq .a
这里的 -r
步骤确保输出是 原始字符串 ,而不是 JSON 文本。因此:
"{\"a\": \"b\"}" -> {"a": "b"},
此“原始字符串”随后可以作为 jq .a
的 JSON 输入,返回 "b"
(或与 -r
一起使用时的 b
旗帜)。
编辑:调用jq
两次并不理想(感谢@peak),之前的命令可以合并到这个oneliner
| jq -r '.x|fromjson.a'