如何用jq工具过滤JSON生成指定格式的连接状态报告?
jq处理JSON生成指定格式报告的解决方案
需求回顾
给定如下JSON文档:
{ "connections": { "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP": { "address": "", "at": "0001-01-01T00:00:00Z", "clientVersion": "", "connected": false, "crypto": "", "inBytesTotal": 0, "isLocal": false, "outBytesTotal": 0, "paused": false }, "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG": { "address": "", "at": "0001-01-01T00:00:00Z", "clientVersion": "", "connected": false, "crypto": "", "inBytesTotal": 0, "isLocal": false, "outBytesTotal": 0, "paused": false } } }
需要生成以连接ID为键、对应connected字段值为值的JSON输出。
正确的jq命令
直接使用map_values函数可快速实现需求:
jq '.connections | map_values(.connected)' demo.json
若需更清晰地处理键值对转换,也可用to_entries与from_entries组合:
jq '.connections | to_entries | map({key: .key, value: .value.connected}) | from_entries' demo.json
两种命令都会输出目标格式:
{ "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP": false, "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG": false }
原命令问题分析
你之前使用的{ id: .connections | keys[] , status : .connections[].connected }会同时遍历所有连接ID和所有connected值,产生笛卡尔积,导致每个ID对应所有connected值,因此出现重复结果。
关于(value?)的含义
你提到的connection.(value?)并非jq语法,而是一种描述性占位写法:
connection.(value?)指connections对象下的任意键名(即那些长字符串形式的连接ID)connection.(value?).connected对应每个键名指向对象中的connected字段值
内容的提问来源于stack exchange,提问作者JBD
相关产品推荐
相关产品推荐

