JQ中.my_array与.my_array[]两种数组访问写法有什么区别?
jq 数组访问两种写法的差异与设计逻辑
精确差异
两种写法的核心区别在返回值的类型、数量和后续操作逻辑:
.my_array是直接取值过滤器:提取JSON中my_array字段对应的完整数组,返回1个类型为数组的结果。后续管道操作会作用在整个数组上,比如执行.my_array | length得到的是数组的元素总数2。.my_array[]是数组展开迭代器:会把输入的数组拆成独立的元素流输出,返回结果的数量等于数组的长度,每个结果的类型是数组元素本身的类型(你示例中就是object类型)。后续管道操作会自动应用到每一个单独的元素上,比如执行.my_array[] | .id会依次返回1、2两个结果。
你可以加-c参数对比输出差异,会更直观:
# 输出1行完整数组 $ echo '{"my_array":[{"id":1},{"id":2}]}' | jq -c '.my_array' [{"id":1},{"id":2}] # 输出2行,每行一个独立的元素 $ echo '{"my_array":[{"id":1},{"id":2}]}' | jq -c '.my_array[]' {"id":1} {"id":2}
设计区分的原因
jq是面向流处理设计的JSON处理工具,这种区分是为了适配不同的处理场景,简化操作逻辑:
- 当你需要对数组整体做操作(比如计算长度、排序、修改后保留原数组结构、统计聚合),直接使用
.my_array操作整个数组即可 - 当你需要对数组内的每个元素单独处理(比如过滤符合条件的元素、逐个修改属性、批量导出元素),直接用
.my_array[]展开即可,不需要额外写循环遍历逻辑,jq会自动把后续的过滤器应用到每个展开的元素上,大幅简化了序列处理的代码。
内容的提问来源于stack exchange,提问作者pje
相关产品推荐
相关产品推荐

