如何解决用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
解决方法
以下是技巧:
echo '{"x": "{\"a\": \"b\"}"}' | jq -r .x | jq .a
此处-r
步骤可确保输出为原始字符串,而不是JSON文本。因此:
"{\"a\": \"b\"}" -> {"a": "b"},
随后可以将该“原始字符串”用作jq .a
的JSON输入,并返回"b"
(或与b
标志一起使用的-r
)。
编辑:两次调用jq
并不理想(感谢@peak),可以在此oneliner中组合上一个命令
| jq -r '.x|fromjson.a'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。