使用jq筛选JSON数组元素时出现异常,求正确实现方法
jq筛选JSON数组元素的错误分析与解决方法
问题情况
你用jq筛选JSON数组中statusId == "10270"的元素时踩了坑:
- 执行
.issuesData.issues[]能正常输出数组里的每个元素; - 用
.issuesData.issues[].statusId="10270"得到的是所有元素statusId被改成10270的数组,这不是筛选; - 用
.issuesData.issues[].statusId=="10270"得到的是[false, true]的布尔数组,只能看到哪些元素符合,拿不到元素本身。
你需要的是获取符合条件的元素本身,或者它们的key字段,对应的JSON结构如下:
{"issuesData": {"issues": [{"id": 3619364,"key": "AIG-1992","hidden": false,"typeId": "1","summary": "XXXXXX","priorityId": "2","done": false,"assignee": "XXXX","assigneeName": "XXXX","hasCustomUserAvatar": false,"autoUserAvatar": {"letter": "B","color": "#d39c3f"},"color": "#ff0000","epicId": "3557134","epic": "AIG-1","estimateStatisticRequired": false,"statusId": "10370","fixVersions": [120044],"projectId": 49202},{"id": 3617950,"key": "AIG-1938","hidden": false,"typeId": "1","summary": "YYYYYY","priorityId": "2","done": false,"assignee": "YYYY","assigneeName": "YYY","hasCustomUserAvatar": false,"autoUserAvatar": {"letter": "F","color": "#7bc1a1"},"color": "#ff0000","epicId": "3658470","epic": "AIG-574","estimateStatisticRequired": false,"statusId": "10270","fixVersions": [],"projectId": 49202}]}}
错误原因
.issuesData.issues[].statusId="10270"是赋值操作,遍历数组每个元素把statusId改成目标值,返回修改后的数组,不是筛选;.issuesData.issues[].statusId=="10270"是逐个判断元素的statusId是否匹配,返回的是每个判断的结果,不是符合条件的元素。
正确操作
1. 获取符合条件的完整元素
用select()函数筛选,语法如下:
.issuesData.issues[] | select(.statusId == "10270")
执行后直接输出符合条件的元素:
{"id":3617950,"key":"AIG-1938","hidden":false,"typeId":"1","summary":"YYYYYY","priorityId":"2","done":false,"assignee":"YYYY","assigneeName":"YYY","hasCustomUserAvatar":false,"autoUserAvatar":{"letter":"F","color":"#7bc1a1"},"color":"#ff0000","epicId":"3658470","epic":"AIG-574","estimateStatisticRequired":false,"statusId":"10270","fixVersions":[],"projectId":49202}
2. 获取符合条件元素的key字段
在筛选后追加提取key的操作:
.issuesData.issues[] | select(.statusId == "10270") | .key
执行后输出:
"AIG-1938"
3. 返回包含符合条件元素的数组
如果需要结果是数组形式(哪怕只有一个元素),可以用map():
.issuesData.issues | map(select(.statusId == "10270"))
执行后输出:
[{"id":3617950,"key":"AIG-1938","hidden":false,"typeId":"1","summary":"YYYYYY","priorityId":"2","done":false,"assignee":"YYYY","assigneeName":"YYY","hasCustomUserAvatar":false,"autoUserAvatar":{"letter":"F","color":"#7bc1a1"},"color":"#ff0000","epicId":"3658470","epic":"AIG-574","estimateStatisticRequired":false,"statusId":"10270","fixVersions":[],"projectId":49202}]
内容的提问来源于stack exchange,提问作者Daniel Ferreira Castro
相关产品推荐
相关产品推荐

