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

如何使用jq从混合对象与字符串的数组中提取名称数组

解决混合类型JSON数组的名称提取问题

没问题,这是个典型的JSON混合类型处理场景,我来教你怎么用jq正确处理!

为什么你的命令会报错?

你之前用的jq -cr '.[].name // []'之所以出错,是因为当遍历到字符串类型的元素时,尝试访问它的.name属性会直接触发错误——字符串根本没有这个属性,而//运算符只有在左侧表达式返回null或false时才会生效,错误会直接中断执行,所以走不到// []的分支。

正确的jq写法

这里有两种简洁可靠的方案:

方案1:显式判断元素类型

用if语句判断每个元素的类型,字符串直接保留,对象则提取.name属性,最后用[]包裹成数组:

jq -c '[.[] | if type == "string" then . else .name end]'

各部分解释:

  • [ ... ]:将处理后的所有元素重新组合成一个数组,这是得到最终数组结果的关键
  • .[]:遍历输入数组的每一个元素
  • if type == "string" then . else .name end:核心逻辑,判断元素类型后选择对应的值
  • -c:输出紧凑的JSON格式(避免换行和空格)

方案2:用try简化代码

如果你喜欢更简洁的写法,可以用try语句尝试提取.name,失败时直接使用元素本身:

jq -c '[.[] | try .name // .]'

逻辑说明:

  • try .name:尝试访问元素的.name属性,如果元素是对象则成功返回值,如果是字符串则抛出错误并返回null
  • // .:当左侧返回null时,直接使用元素本身(也就是字符串值)

测试效果

假设你的输入是:

[{"name":"NAME_1"},"NAME_2"]

执行任意一种方案的命令后,都会得到你想要的输出:

["NAME_1","NAME_2"]

如果想要不带JSON引号的原始值(每行一个名称),可以去掉[ ... ]并加上-r参数:

jq -r '.[] | if type == "string" then . else .name end'

输出结果:

NAME_1
NAME_2

内容的提问来源于stack exchange,提问作者Saddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:43:11