Как проанализировать данные и записать в файл JSON - PullRequest
2 голосов
/ 19 марта 2019

Здесь мы заменяем значение " dpidsha1 " из 1234 на другое значение " abcd " в константе JSON и сталкиваемся с ошибкой при записи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 голосов
/ 19 марта 2019

Я бы предпочел использовать функции Utility конвейеров Jenkins вместо классных классов.Ниже работает трубопровод.В конце я упростила вывод на экран, чтобы проверить результат использования команды 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'
}
0 голосов
/ 19 марта 2019

Вы можете добавить @NonCPS аннотацию для вашего метода следующим образом:

@NonCPS
def buildContent(){
    ...
}

Аннотация @NonCPS полезна, когда у вас есть методы, которые используют объекты, которые не сериализуются. Обычно все объекты, которые вы создаете в скрипте конвейера, должны быть сериализуемыми (причина этого в том, что Jenkins должен иметь возможность сериализовать состояние скрипта, чтобы его можно было приостановить и сохранить на диске).

Когда вы добавляете @NonCPS к методу, Дженкинс выполнит весь метод за один раз без возможности приостановки. Кроме того, вы не можете ссылаться на какие-либо шаги конвейера или преобразованные методы CPS из аннотированного метода @NonCPS. Более подробную информацию об этом можно найти здесь .

...