微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用jq在json中提取json

如何解决用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 举报,一经查实,本站将立刻删除。