I am retrieving JSON object from a URL using httpRequest in a groovy script.

pipeline {
  agent any
  stages {
      stage ('Extract Data') {
          steps {
            script {
              def response = httpRequest \
              authentication: 'user', \
              httpMode: 'GET', \
              url: "https://example.com/data"
              writeFile file: 'output.json', text: response.content

              def data = readFile(file: 'output.json')
              def details = new groovy.json.JsonSlurperClassic().parseText(data)

              echo "Data: ${details.fields.customfield}"                                        


I am interested in the customfieldstring. The format of the string is:

Application!01.01.01 TestSuite1,TestSuite2,TestSuite3,TestSuite4 Product!01.01.01,Product2!01.01.02

I would like to parse the string into 3 data sets:

  1. Map of Applications [Application: version] (there will always be one Appliction)
  2. List of TestSuites [TestSuite1,...,TestSuite]
  3. Map of Prodcts [Product1: version,..., ProductN: version].

However, I am not sure how to do this. Are there any Jenkins Groovy libraries that I can use to do this in a declarative pipeline?

EDIT Based on the answer below I can see that I can make a map in the following way:

def applications = groups[0].split(',').collect { it.split('!') }.collectEntries { [(it):it] }

In the example I have:

application = [Application: Application]

How do I get: application = [Application: 01.01.01]

EDIT2 Note the following output:

def applications = groups[0].split(',').collect { it.split('!') }
[[Application, 01.01.01]]

3 Answers

SSF On Best Solutions

I found a method. Groovy can convert the values of an Object array and convert them into a map with the toSpreadMap(). However, the array must have an even number of elements.

def appList = ['DevOpsApplication', '01.01.01']
def appMap = appList.toSpreadMap()

For some better answers please refer to this

Opal On

There're no libraries I'm aware of that will have functionality to parse the data but, since you know the format of the data it's easy to parse them manually.

There are 3 groups in the input (applications, suites, products) separated by a character. To get the groups you need:

def input = "Application!01.01.01 TestSuite1,TestSuite2,TestSuite3,TestSuite4 Product!01.01.01,Product2!01.01.02"
def groups = input.split(' ')

To process the applications you need to split group 0 with , character (just in case there are many applications). You got a list of pairs in format: name!version. Every pair must be splitted with !, so you get a list of lists in format: [[name, version]]. From the last structure it's easy to create a map. All steps together:

def applications = groups[0].split(',').collect { it.split('!') }.collectEntries { [(it[0]):it[1]] }

Getting the list of suites is easy, just split group 1 with , character:

def suites = groups[1].split(',')

Finally, products are analogical to the list of applications but this time group 2 should be used:

def products = groups[2].split(',').collect { it.split('!') }.collectEntries { [(it[0]):it[1]] }
yong On

You can simplifier your issue by using pipeline utility step: readJSON

def data = readJSON(file: 'output.json')

echo data.fields.customfield