如何解析数据并写入JSON文件

时间:2019-03-19 04:06:45

标签: jenkins groovy jenkins-pipeline jenkins-groovy

在这里,我们将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

我该如何解决?

2 个答案:

答案 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'
}