Не такое исключение Map с Дженкинсом и Groovy - PullRequest
0 голосов
/ 14 января 2020

У меня есть строка в groovy, которую я хочу преобразовать в карту. Когда я запускаю код на своем локальном компьютере через сценарий groovy для тестирования, у меня не возникает проблем, и возвращается ленивая карта. Затем я могу преобразовать это в обычную карту, и жизнь продолжается. Когда я пытаюсь использовать тот же код в своем конвейере Jenkins DSL, я сталкиваюсь с исключением

groovy.json.internal.Exceptions$JsonInternalException: Not that kind of map

Вот фрагмент кода, о котором идет речь:

  import groovy.json.*

  String string1 = "{value1={blue green=true, red pink=true, gold silver=true}, value2={red gold=false}, value3={silver brown=false}}"

  def stringToMapConverter(String stringToBeConverted){
      formattedString = stringToBeConverted.replace("=", ":")
      def jsonSlurper = new JsonSlurper().setType(JsonParserType.LAX)
      def mapOfString = jsonSlurper.parseText(formattedString)
      return mapOfString
  }

  def returnedValue = stringToMapConverter(string1)

  println(returnedValue)

возвращаемое значение:

[value2:[red gold:false], value1:[red pink:true, gold silver:true, blue green:true], value3:[silver brown:false]]

Я знаю, что Дженкинс и Groovy отличаются по-разному, но из поисковых запросов в Интернете другие предполагают, что я должен иметь возможность использовать библиотеку LAX JsonSlurper в моем groovy конвейере. Я пытаюсь избежать ручного сворачивания моей собственной строки в конвертер карт и предпочел бы использовать библиотеку, если она там есть. Какая здесь может быть разница, которая бы вызывала такое поведение?

1 Ответ

0 голосов
/ 15 января 2020

Попробуйте использовать

import groovy.json.*

//@NonCPS
def parseJson(jsonString) {
    // Would like to use readJSON step, but it requires a context, even for parsing just text.
    def lazyMap = new JsonSlurper().setType(JsonParserType.LAX).parseText(jsonString.replace("=", ":").normalize())

    // JsonSlurper returns a non-serializable LazyMap, so copy it into a regular map before returning
    def m = [:]
    m.putAll(lazyMap)
    return m
}

String string1 = "{value1={blue green=true, red pink=true, gold silver=true}, value2={red gold=false}, value3={silver brown=false}}"
def returnedValue = parseJson(string1)
println(returnedValue)
println(JsonOutput.toJson(returnedValue))

Вы можете найти информацию о normalize здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...