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

Groovy解析JSON遇阻:Jenkins中CONFLICTED结果判断失败求助

我来帮你搞定这两个问题,都是因为对JSON结构的处理逻辑走偏了:

问题1:readJSON的遍历逻辑完全错了

你遍历mergeResponse.values的操作根本没必要——你的JSON是单个顶层对象,不是数组。mergeResponse.values()会返回这个对象里所有属性的零散值(比如false、true、"CONFLICTED"、vetoes数组),循环里的mergenew就是这些单个值,它们根本没有outcome属性,所以你的条件判断永远不会触发,自然跳过了if代码块。

正确的写法直接访问对象的outcome属性就行,不用画蛇添足搞循环:

def mergeResponse = readJSON file: mergeFileName
if (mergeResponse.outcome == "CONFLICTED") {
    echo "pull request can not be merged"
}

问题2:JsonSlurper的参数传错了

你这里犯了两个小错误:

  1. 传给parseText()的mergenew不是JSON字符串,而是之前错误循环里的键值对项(ListOrderedMapEntry),这就导致了方法不匹配的报错;
  2. 你还写了mergenew.getString("id"),但你的JSON里根本没有id这个属性,就算前面的问题解决了,这里也会报错。

正确的用法是先把JSON内容解析成对象,再直接判断outcome:

import groovy.json.JsonSlurper
import java.io.File

// 从文件读取JSON的话,用parse(File)方法
def slurper = new JsonSlurper()
def mergeResponse = slurper.parse(new File(mergeFileName))

// 如果是从字符串解析才用parseText(),比如你直接拿到JSON字符串的情况:
// def jsonString = '{"canMerge":false,"conflicted":true,"outcome":"CONFLICTED","vetoes":[{"summaryMessage":"Requires approvals","detailedMessage":"You need 2 more approvals before this pull request can be merged."}]}'
// def mergeResponse = slurper.parseText(jsonString)

if (mergeResponse.outcome == "CONFLICTED") {
    echo "pull request can not be merged"
    // 要是需要处理否决信息,还可以遍历vetoes数组
    mergeResponse.vetoes.each { veto ->
        echo "Veto提示:${veto.summaryMessage}"
        echo "详细说明:${veto.detailedMessage}"
    }
}

补充一句:你的JSON结构是一个顶层对象,包含canMerge、conflicted、outcome、vetoes四个属性,其中vetoes是数组。不管用哪种方法,都不需要遍历顶层对象的values,直接访问属性就好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:32:57