使用 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'