首页 > 解决方案 > 用jq提取json里面的json

问题描述

我经常发现自己想用jq命令解析 json,但是 json 中的一个值是一个转义的 json 字符串。

例如,如果我像这样使用 python 生成数据:

import json
inner = {'a': 'b'}
outer = {'x': json.dumps(inner)}
json.dumps(outer)

我得到:

{"x": "{\"a\": \"b\"}"}

如何"b"使用该jq命令?

$ 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

标签: jsonescapingjq

解决方案


以下是诀窍:

echo '{"x": "{\"a\": \"b\"}"}' | jq -r .x | jq .a

这里的-r步骤确保输出是原始字符串,而不是 JSON 文本。所以:

"{\"a\": \"b\"}" -> {"a": "b"},

这个“原始字符串”随后可以作为 JSON 输入jq .a,返回"b"(或b-r标志一起使用)。

编辑:调用jq两次并不理想(感谢@peak),可以在这个 oneliner 中组合上一个命令

| jq -r '.x|fromjson.a'

推荐阅读