如何使用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
相关产品推荐
相关产品推荐

