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

Jenkins共享库嵌套列表转JSON为空及字符串转义问题求助

解决Jenkins共享库中嵌套列表Map转JSON空对象问题

核心问题原因

Jenkins共享库基于CPS序列化机制运行,对类的访问权限和序列化规则要求比本地Groovy严格。你的私有非静态内部类Entry的属性无法被JsonOutput的反射机制正常读取,导致序列化后生成空对象{},但本地测试不受CPS限制,所以功能正常。

解决方案

方案1:修改Entry类为静态内部类

将私有内部类改为静态内部类,确保JsonOutput能正常访问其属性:

class SpecialJob implements Serializable {
    // 改为静态内部类并实现Serializable
    private static class Entry implements Serializable {
        String name
        String description
    }

    def steps

    SpecialJob(steps) { this.steps = steps }
    // ... 其他代码不变
}

方案2:手动将Entry转为Map后序列化

不修改类结构,在构建JSON内容时,把Entry对象转换成Map列表,JsonOutput能正确处理Map:

def content = [
    name: args.name,
    items: [buckets: entries.collect { 
        [name: it.name, description: it.description] 
    }]
]

def jsonContent = JsonOutput.toJson(content)

手动拼接JSON的转义问题解决

如果必须手动拼接,不要自行添加转义,利用JsonOutput处理单个条目后再拼接:

// 先将每个Entry转为JSON字符串
def itemStrs = entries.collect { entry ->
    JsonOutput.toJson([name: entry.name, description: entry.description])
}

// 拼接成完整JSON
def jsonContent = """
{
    "name": "${JsonOutput.escape(args.name)}",
    "items": {
        "buckets": [${itemStrs.join(',')}]
    }
}
"""

注意用JsonOutput.escape()处理字符串中的特殊字符,避免JSON格式错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:22:42