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"},
这个“原始字符串”随后可以作为 JSON 输入jq .a
,返回"b"
(或b
与-r
标志一起使用)。
编辑:调用jq
两次并不理想(感谢@peak),可以在这个 oneliner 中组合上一个命令
| jq -r '.x|fromjson.a'
推荐阅读
- javascript - InversifyJS:从多注入定义中注入特定的混凝土
- php - 雄辩的更新或更新时创建隐藏列
- python-3.x - 如何对 DataFrame 的每一行中的“种类”检查值进行矢量化并更新计数?
- android - Android - 通过图像组件循环
- python - 在 Python 的面向对象编程中 self 如何工作?
- oracle - CURRENT_TIMESTAMP 最大长度
- xamarin.android - 如何使 EditText 成为焦点但不可点击?(Xamarin.Android)
- gradle - 从 gradle 调用 ant 时抛出 org.gradle.process.internal.ExecException
- c# - Unity - 实例化后游戏对象的错误定位
- hsts - hsts 预加载而不被列出?