如何使用jq获取数组中的字段或返回null?
问题说明
运行以下命令后,仅能获取数组中的第一个元素,同时出现“Cannot iterate over null (null)”错误。需求是:当.in或.in.id为null时,让area_or_null返回null。使用?可消除错误,但仍仅返回第一个元素。
原始命令及输出
echo '[{"a":1, "in": [{"id":2}] },{"a":4}]' | jq '.[] | {section:.a, area_or_null:.in[].id}'
输出:
{ "section": 1, "area_or_null": 2 } jq: error (at <stdin>:1): Cannot iterate over null (null)
解决方案
根据需求场景不同,有两种实现方式:
方式1:每个原对象对应一个结果,保留ID数组结构
如果希望当.in是数组时,area_or_null返回所有ID组成的数组;当.in为null时返回null,使用以下命令:
echo '[{"a":1, "in": [{"id":2}] },{"a":4}]' | jq '.[] | {section:.a, area_or_null: (.in | map(.id) // null)}'
输出:
{ "section": 1, "area_or_null": [ 2 ] } { "section": 4, "area_or_null": null }
map(.id):遍历.in数组元素,提取每个元素的id字段;// null:当.in为null时,将area_or_null设为null。
方式2:展开数组元素,同时保留无.in的对象结果
如果希望和原始命令逻辑一致,将.in数组的每个元素展开为独立结果,同时让无.in的对象也输出area_or_null: null,使用以下命令:
echo '[{"a":1, "in": [{"id":2}] },{"a":4}]' | jq '.[] | if .in then .in[] | {section: .a, area_or_null: .id // null} else {section: .a, area_or_null: null} end'
输出:
{ "section": 1, "area_or_null": 2 } { "section": 4, "area_or_null": null }
if .in then ... else ... end:判断.in是否存在;.in[]:展开数组元素生成独立结果;.id // null:当数组元素无id字段时,返回null。
内容的提问来源于stack exchange,提问作者Andrew Benor
相关产品推荐
相关产品推荐

