使用jq解析含空数组的JSON无结果,求问题原因及解决方法
解决jq解析空数组时无输出的问题
问题原因
你遇到的核心问题是:当使用.connections[]?展开空数组时,这个表达式会返回空序列(没有任何输出值)。而在jq的对象构造语法{ 字段名: 表达式 }中,如果右侧的表达式返回空序列,整个对象构造的结果也会变成空序列,最终就不会输出任何内容。
对比你正常执行的语句:因为.actions[]?能展开出有效元素,所以整个对象能正常构造并输出;但当connections是空数组时,.connections[]?没有输出,导致整个对象构造失败。
解决方案
要保留空数组的输出(即使是空的),需要把展开后的结果包裹在数组中,或者使用map函数处理数组:
方案1:用数组包裹展开表达式
把connections: .connections[]? | { id: .id }修改为:
connections: [.connections[]? | { id: .id }]
这样即使connections是空数组,[]也会把空序列转为空数组,最终对象的connections字段会显示为[],整个对象能正常输出。
方案2:使用map函数(更简洁)
map函数专门用于处理数组,会遍历数组每个元素并应用转换,空数组处理后还是空数组:
connections: .connections | map({ id: .id })
这个写法和方案1效果一致,但更符合jq的数组处理习惯。
修正后的完整jq语句
(注:你原语句里的.instances[]?应为.apps[]?的笔误)
apps: .apps[]? | { id: .id, actions: [.actions[]? | { id: .id }], connections: .connections | map({ id: .id }) }
执行后会输出:
{ "apps": { "id": "1a902fb4-1b43-4df9-b9d7-9b54cd14e2ad", "actions": [ { "id": "0dc38f41-49fe-4056-b035-850764733a44" } ], "connections": [] } }
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

