如何使用jq从JSON中提取可变键及其对应值?
使用jq提取可变键名的JSON中的键与对应年龄
针对你提供的这种包含可变键名的JSON结构,用jq的to_entries方法就能轻松搞定,具体命令如下:
jq 'to_entries | map("\(.key): \(.value.age)") | .[]' your_json_file.json
分步解释:
to_entries:这一步是关键,它会把原JSON里的每个顶层键值对转换成{"key": "john", "value": {"age":40, "nickname":"jo"}}这样的数组元素,让原本零散的可变键名变成统一可遍历的结构。map("\(.key): \(.value.age)"):遍历转换后的数组,把每个元素格式化为你想要的"键名: 年龄"字符串格式,这里用jq的字符串插值\(.xxx)来提取对应的值。.[]:把处理后的数组展开,让每个结果单独占一行输出。
如果你的JSON内容不是来自文件,而是直接输入,也可以用管道传递:
echo '{ "john": {"age": 40, "nickname": "jo"}, "mary": {"age": 50, "nickname": "mo"} }' | jq 'to_entries | map("\(.key): \(.value.age)") | .[]'
执行后会得到你想要的结果:
"john": 40 "mary": 50
要是你希望输出不带引号的纯文本格式,只需要加上-r(raw output)参数即可:
jq -r 'to_entries | map("\(.key): \(.value.age)") | .[]' your_json_file.json
此时输出为:
john: 40 mary: 50
内容的提问来源于stack exchange,提问作者Markus




