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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:26:29