如何在Jenkins Pipeline中用Groovy提取JSON深层字段并做值对比
解决Jenkins Pipeline中Groovy提取JSON深层字段并校验的问题
没问题,我来帮你搞定这个JSON字段提取和校验的事儿!首先得先明确你的JSON结构(毕竟你提到能访问到101层级,我先假设你的JSON大概是这种嵌套对象的格式,要是结构不一样你可以调整):
{ "101": { "value": "11br", "revision": "R36.0 lsp" }, "lsp": { "value": "11br", "revision": "R36.0 lsp" } }
步骤1:读取JSON文件到Groovy对象
Jenkins Pipeline自带readJSON步骤,可以直接把JSON文件转换成Groovy可操作的对象,非常方便:
// 读取指定路径的JSON文件 def productData = readJSON file: './your-product-config.json'
步骤2:提取深层字段(重点解决你的问题)
因为101是数字开头的键,Groovy里不能直接用.来访问(比如productData.101会报错),得用方括号语法来定位层级,然后再用.或者方括号取深层的value和revision:
// 提取101产品的字段 def product101Value = productData['101'].value def product101Revision = productData['101'].revision // 提取lsp产品的字段(lsp是字母开头,两种方式都可以) def productLspValue = productData.lsp.value def productLspRevision = productData['lsp']['revision']
步骤3:字段值校验
接下来就可以对比输入的预期值了,用assert或者Jenkins的error步骤来触发流水线失败(如果校验不通过):
// 定义预期值 def expectedValue = "11br" def expectedRevision = "R36.0 lsp" // 校验101产品的字段 assert product101Value == expectedValue : "101产品的value字段不匹配,预期:${expectedValue},实际:${product101Value}" assert product101Revision == expectedRevision : "101产品的revision字段不匹配,预期:${expectedRevision},实际:${product101Revision}" // 校验lsp产品的字段 assert productLspValue == expectedValue : "lsp产品的value字段不匹配,预期:${expectedValue},实际:${productLspValue}" assert productLspRevision == expectedRevision : "lsp产品的revision字段不匹配,预期:${expectedRevision},实际:${productLspRevision}"
完整Pipeline示例
把上面的步骤整合起来,就是一个可运行的流水线片段:
pipeline { agent any stages { stage('Validate Product Config') { steps { script { // 读取JSON文件 def productData = readJSON file: './product-config.json' // 定义预期值 def expectedValue = "11br" def expectedRevision = "R36.0 lsp" // 处理101产品的校验 def product101 = productData['101'] if (!product101) { error("JSON中未找到101产品的配置") } assert product101.value == expectedValue : "101产品value不匹配:预期${expectedValue},实际${product101.value}" assert product101.revision == expectedRevision : "101产品revision不匹配:预期${expectedRevision},实际${product101.revision}" // 处理lsp产品的校验 def productLsp = productData.lsp if (!productLsp) { error("JSON中未找到lsp产品的配置") } assert productLsp.value == expectedValue : "lsp产品value不匹配:预期${expectedValue},实际${productLsp.value}" assert productLsp.revision == expectedRevision : "lsp产品revision不匹配:预期${expectedRevision},实际${productLsp.revision}" echo "所有产品字段校验通过!" } } } } }
注意事项
- 如果你的JSON结构是数组格式(比如
[{"product": "101", "value": "...", ...}, ...]),那你需要先遍历数组找到对应产品的元素,比如用find方法:def targetProduct = productData.find { it.product == '101' } def product101Value = targetProduct?.value - 用
?.安全导航操作符可以避免字段不存在时抛出空指针异常,比如productData['101']?.value,如果101层级不存在,会返回null而不是报错。
内容的提问来源于stack exchange,提问作者DevOops
相关产品推荐
相关产品推荐

