1. 概述
序列化(Serialization) 是在任何编程语言中操作对象时的一个核心概念。它指的是将对象转换为一种标准格式的字节流,以便存储或传输。通过序列化,我们可以保存对象的状态、传输它,并在不同的系统中重新构建该对象。
本文将介绍如何在 Jenkins 流水线中使用 Groovy 将对象序列化为 JSON 字符串。
2. 在 Jenkins 中创建 Groovy 对象
Jenkins 支持在流水线脚本中使用 Groovy 语言,这为流程定制和复杂逻辑实现提供了极大的灵活性。我们可以在 声明式或脚本式流水线 中使用 script
块来编写 Groovy 代码。
以下是一个在 Jenkins 流水线中定义并使用 Groovy 变量的示例:
pipeline {
agent any
stages {
stage("创建 Groovy 变量") {
steps {
script {
def student = ["name":"John", "age":20, "subjects":["English", "Math", "Physics"]]
echo "变量类型是 ${student.getClass()}"
echo "学生姓名是 ${student.name}"
echo "学生年龄是 ${student.age}"
echo "第一门课程是 ${student.subjects[0]}"
}
}
}
}
}
输出结果如下:
[Pipeline] echo
变量类型是 class java.util.LinkedHashMap
[Pipeline] echo
学生姓名是 John
[Pipeline] echo
学生年龄是 20
[Pipeline] echo
第一门课程是 English
我们看到,Groovy 中的 Map
实际上是 Java 的 LinkedHashMap
实现。这为我们后续进行 JSON 序列化提供了基础。
3. 使用 JsonOutput
类生成 JSON 字符串
Groovy 提供了原生的 JsonOutput
类来将对象序列化为 JSON 字符串。它属于 groovy.json
包,其中包含了处理 JSON 的多个类。
JsonOutput.toJson()
是一个静态方法,接受一个 Groovy 对象作为参数,并返回对应的 JSON 字符串。我们来看一个示例:
import groovy.json.JsonOutput
pipeline {
agent any
stages {
stage("使用 JsonOutput 序列化") {
steps {
script {
def student = ["name":"John", "age":20, "subjects":["English", "Math", "Physics"]]
def json_string = JsonOutput.toJson(student)
def json_pretty = JsonOutput.prettyPrint(json_string)
echo "${json_pretty}"
}
}
}
}
}
输出结果如下:
[Pipeline] echo
{
"name": "John",
"age": 20,
"subjects": [
"English",
"Math",
"Physics"
]
}
通过 toJson()
和 prettyPrint()
,我们成功将 Groovy 对象转换为结构清晰的 JSON 字符串。这个 JSON 可以用于存储、传输,或者后续处理。
4. 使用 Jenkins 原生 writeJSON
步骤生成 JSON
除了使用 JsonOutput
,我们还可以使用 Jenkins 自带的 writeJSON
步骤来完成序列化操作。这个步骤属于 Pipeline Utility Steps 插件,使用前需要先安装该插件。
✅ 安装插件截图如下:
安装完成后,我们可以这样使用 writeJSON
:
pipeline {
agent any
stages {
stage("使用 writeJSON 序列化") {
steps {
script {
def student = ["name":"John", "age":20, "subjects":["English", "Math", "Physics"]]
def json_pretty = writeJSON(json: student, returnText: true, pretty: 4)
echo "${json_pretty}"
}
}
}
}
}
参数说明如下:
json
: 要序列化的 Groovy 对象returnText
: 是否返回字符串而不是写入文件pretty
: 缩进空格数,用于美化输出格式
输出结果如下:
[Pipeline] echo
{
"name": "John",
"age": 20,
"subjects": [
"English",
"Math",
"Physics"
]
}
⚠️ 注意:writeJSON
默认会自动格式化输出内容,但缩进层级可能与 JsonOutput.prettyPrint()
略有不同。
5. 总结
在 Jenkins 流水线中,我们可以通过 Groovy 定义对象,并利用以下两种方式将其序列化为 JSON:
- ✅ 使用 Groovy 原生的
JsonOutput
类,适用于通用场景,无需额外插件 - ✅ 使用 Jenkins 插件
writeJSON
步骤,适合 Jenkins 环境下集成使用,语法更简洁
两种方式各有优劣,选择时可以根据项目需求和 Jenkins 插件支持情况灵活决定。如果你希望减少依赖,推荐使用 JsonOutput
;如果已在 Jenkins 环境中,使用 writeJSON
更加便捷。