如何使用jq筛选嵌套数组中field.usesEncryption为true的连接?
用jq筛选包含
field.usesEncryption=true的connection 需求:从给定的JSON数据中,使用jq工具筛选出所有包含至少一个field.usesEncryption属性为true的connection对象。
示例JSON数据
{ "connections": { "connection": [ { "field": [ { "id": "url", "encryptedValueSet": false, "usesEncryption": false, "componentOverride": false, "useDefault": false }, { "id": "user", "encryptedValueSet": false, "usesEncryption": false, "componentOverride": false, "useDefault": false }, { "id": "password", "encryptedValueSet": true, "usesEncryption": true, "componentOverride": false, "useDefault": false } ], "id": "3ea89002-51f5-4369-9539-63c3bd406a64" } ] } }
未达预期的尝试命令
jq '. | select(.connections.connection[].field[] | .usesEncryption==true)' EnvironmentExtensions.json jq '. | .connections.connection[].field[] | select(.usesEncryption==true)' EnvironmentExtensions.json
正确的jq命令
方法一:直接遍历筛选
jq '.connections.connection[] | select(.field[] | .usesEncryption == true)' EnvironmentExtensions.json
遍历每个connection对象,检查其field数组中是否存在usesEncryption=true的元素,只要存在就保留整个connection。
方法二:用any函数明确逻辑(推荐)
jq '.connections.connection[] | select(any(.field[]; .usesEncryption == true))' EnvironmentExtensions.json
any函数专门用于判断数组中是否存在至少一个元素满足指定条件,逻辑更清晰,可读性更强,避免歧义。
之前命令无效的原因
- 第一条命令是对整个根JSON对象做筛选,只要有任意一个connection的field满足条件,就会返回整个根对象,而非目标connection。
- 第二条命令仅输出了符合条件的field对象,而非包含该field的完整connection。
内容的提问来源于stack exchange,提问作者Anil Samuel
相关产品推荐
相关产品推荐

