在这里,我们将JSON内容中的 1234 中的一个 dpidsha1 值替换为另一个值“ abcd ”,然后将JSON格式的内容写入文件“ uselessfile.json”时出错,并打印文件“ uselessfile.json”的内容
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
def buildContent(){
def content = """
{
"app":{ },
"at":2,
"badv":[ ],
"bcat":[ ],
"device":[ {
"carrier":"310-410",
"connectiontype":3,
"devicetype":1,
"dnt":0,
"dpidmd5":"268d403db34e32c45869bb1401247af9",
"dpidsha1":"1234"
},
{
"carrier":"310-410",
"connectiontype":3,
"devicetype":1,
"dnt":0,
"dpidmd5":"268d403db34e32c45869bb1401247af9",
"dpidsha1":"1234"
}]
}"""
def slurped = new JsonSlurper().parseText(content)
def builder = new JsonBuilder(slurped)
builder.content.device.find{it.dpidsha1}.dpidsha1= "abcd"
println(builder.toPrettyString())
writeFile file: 'uselessfile.json', text: builder.toPrettyString(content)
File file = new File("uselessfile.json")
println "Below is the content of the file ${file.absolutePath}"
println uselessfile.json
错误:
[管道]管道末端发生了一个异常:在字段中 com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals
原因:java.io.NotSerializableException:groovy.json.JsonBuilder
我该如何解决?
答案 0 :(得分:0)
您可以在方法上添加@NonCPS
批注,如下所示:
@NonCPS
def buildContent(){
...
}
当您使用的方法使用无法序列化的对象时,@ NonCPS注释将非常有用。通常,您在管道脚本中创建的所有对象都必须可序列化(原因是Jenkins必须能够序列化脚本的状态,以便可以将其暂停并存储在磁盘上)。
将@NonCPS放在方法上时,Jenkins将一次性执行整个方法,而不会暂停。同样,您不能从@NonCPS注释的方法中引用任何管道步骤或CPS转换的方法。 More information about this can be found here。
答案 1 :(得分:0)
我更喜欢使用Jenkins Pipelines的Utility函数而不是groovy类。以下管道有效。最后,我简化了转储到屏幕的过程,以验证使用bash cat命令的结果。但是结果就是您想要的。
node('linux') {
def content = """
{
"app":{ },
"at":2,
"badv":[ ],
"bcat":[ ],
"device":[ {
"carrier":"310-410",
"connectiontype":3,
"devicetype":1,
"dnt":0,
"dpidmd5":"268d403db34e32c45869bb1401247af9",
"dpidsha1":"1234"
},
{
"carrier":"310-410",
"connectiontype":3,
"devicetype":1,
"dnt":0,
"dpidmd5":"268d403db34e32c45869bb1401247af9",
"dpidsha1":"1234"
}]
}"""
def slurped = readJSON text: content
println (slurped)
def builder = slurped
builder.device.find{it.dpidsha1 == "1234"}.dpidsha1= "abcd"
println(builder)
writeJSON file: 'uselessfile.json', json: builder, pretty: 4
sh 'cat uselessfile.json'
}