如何用jq排除JSON输出中的_class字段?
解决Jenkins接口JSON结果中排除_class字段的问题
直接构造目标字段的对象(最稳妥的方式)
不用纠结del或|not的问题,直接在筛选后构造只包含displayName和number的新对象,这是最直接且不易出错的方法:
处理单条构建数据
如果你的curl返回单个构建对象,执行:
curl -s "http://your-jenkins/job/your-job/123/api/json" | jq 'select(.displayName == "目标名称") | {displayName, number}'
处理构建数组(比如/job/xxx/api/json返回的builds列表)
如果是批量获取构建列表并筛选,执行:
curl -s "http://your-jenkins/job/your-job/api/json?tree=builds[displayName,number,_class]" | jq '.builds[] | select(.displayName == "目标名称") | {displayName, number}'
如果需要将结果重新整理为JSON数组,在外层加[]包裹:
curl -s "http://your-jenkins/job/your-job/api/json?tree=builds[displayName,number,_class]" | jq '[.builds[] | select(.displayName == "目标名称") | {displayName, number}]'
为什么之前的del命令没生效?
大概率是路径问题,比如你可能在错误的层级调用了del。举个反例,如果写成:
# 错误示例:del的位置不对,或者没正确链式调用 curl -s "your-url" | jq 'del(._class) | .builds[] | select(.displayName == "目标名称")'
这种写法会先删除顶层的_class(而顶层可能根本没有这个字段),而不是删除每个构建对象里的_class。如果一定要用del,正确的写法是在筛选后针对每个对象删除:
curl -s "your-url" | jq '.builds[] | select(.displayName == "目标名称") | del(._class)'
但这种写法会保留除_class外的所有其他字段,不如直接构造目标对象精准。
示例效果
原始JSON片段(单条构建):
{
"_class": "hudson.model.FreeStyleBuild",
"displayName": "#456",
"number": 456,
"url": "http://jenkins/job/test/456/"
}
执行正确命令后输出:
{
"displayName": "#456",
"number": 456
}
内容的提问来源于stack exchange,提问作者macder
相关产品推荐
相关产品推荐

