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
相关产品推荐
相关产品推荐

