You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:05:34