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的参数传错了
你这里犯了两个小错误:
- 传给
parseText()的mergenew不是JSON字符串,而是之前错误循环里的键值对项(ListOrderedMapEntry),这就导致了方法不匹配的报错; - 你还写了
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
相关产品推荐
相关产品推荐

