Groovy(Jenkinsfile)解析JSON文件时如何维持原有元素顺序
问题根因
Groovy 部分老版本的原生JSON解析类在Jenkins沙箱环境下运行时,可能出现数组序列化、反序列化过程中顺序变更的问题,导致原JSON文件里的标签排序错乱。
解决方案
方案1:使用Jenkins官方readJSON流水线步骤(优先推荐)
首先确保Jenkins已安装Pipeline Utility Steps插件,该插件为官方维护的常用工具插件,大部分Jenkins实例已默认预装。该步骤原生支持完全保留JSON文件的原数组顺序,无需额外配置:
// 读取本地JSON文件,返回结果的顺序与原文件完全一致 def dockerTagList = readJSON file: './docker-tags.json' // 配置构建参数的可选值 pipeline { agent any parameters { choice( name: 'TEST_DOCKER_TAG', choices: dockerTagList, description: '选择待测试的Docker镜像标签,按发布时间倒序排列,最新版本在前' ) } // 剩余流水线逻辑 }
方案2:使用原生Groovy解析类强制有序
如果无法安装上述插件,必须使用原生Groovy JSON解析工具,可以显式指定解析结果用有序集合存储,确保顺序不丢失:
import groovy.json.JsonSlurper // 显式指定数组类型JSON用有序ArrayList存储 def slurper = new JsonSlurper() slurper.setType(groovy.json.JsonSlurper.Type.LIST) // 读取并解析文件 def jsonText = new File('./docker-tags.json').text def dockerTagList = slurper.parseText(jsonText) as List<String>
如果使用JsonSlurperClassic,可以通过强制类型转换为ArrayList保证顺序:
import groovy.json.JsonSlurperClassic def slurper = new JsonSlurperClassic() def jsonText = new File('./docker-tags.json').text def dockerTagList = slurper.parseText(jsonText) as ArrayList<String>
验证方法
解析完成后可以打印列表的前几个元素,和原JSON文件对比即可确认顺序是否一致:
println "解析得到的标签前3位:${dockerTagList.take(3)}"
内容的提问来源于stack exchange,提问作者Micael
相关产品推荐
相关产品推荐

