Create JSON strings from Groovy variables in Jenkins Pipeline Create JSON strings from Groovy variables in Jenkins Pipeline jenkins jenkins

Create JSON strings from Groovy variables in Jenkins Pipeline


JSON is a format that uses human-readable text to transmit data objects consisting of attribute–value pairs and array data types.So, in general json is a formatted text.

In groovy json object is just a sequence of maps/arrays.

parsing json using JsonSlurperClassic

//use JsonSlurperClassic because it produces HashMap that could be serialized by pipelineimport groovy.json.JsonSlurperClassicnode{    def json = readFile(file:'message2.json')    def data = new JsonSlurperClassic().parseText(json)    echo "color: ${data.attachments[0].color}"}

parsing json using pipeline

node{    def data = readJSON file:'message2.json'    echo "color: ${data.attachments[0].color}"}

building json from code and write it to file

import groovy.json.JsonOutputnode{    //to create json declare a sequence of maps/arrays in groovy    //here is the data according to your sample    def data = [        attachments:[            [                fallback: "New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>",                pretext : "New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>",                color   : "#D00000",                fields  :[                    [                        title: "Notes",                        value: "This is much easier than I thought it would be.",                        short: false                    ]                ]            ]        ]    ]    //two alternatives to write    //native pipeline step:    writeJSON(file: 'message1.json', json: data)    //but if writeJSON not supported by your version:    //convert maps/arrays to json formatted string    def json = JsonOutput.toJson(data)    //if you need pretty print (multiline) json    json = JsonOutput.prettyPrint(json)    //put string into the file:    writeFile(file:'message2.json', text: json)}


Found this question while I was trying to do something (I believed) should be simple to do, but wasn't addressed by the other answer. If you already have the JSON loaded as a string inside a variable, how do you convert it to a native object? Obviously you could do new JsonSlurperClassic().parseText(json) as the other answer suggests, but there is a native way in Jenkins to do this:

node () {  def myJson = '{"version":"1.0.0"}';  def myObject = readJSON text: myJson;  echo myObject.version;}

Hope this helps someone.

Edit: As explained in the comments "native" isn't quite accurate.


If you are stucked on an installation using sandboxes and Jenkins Script Security plugin with no possibility to add whitelisted classes/methods, the only way I found is the following :

def slackSendOnRestrictedContext(params) {    if (params.attachments != null) {        /* Soooo ugly but no other choice with restrictions of           Jenkins Script Pipeline Security plugin ^^ */        def paramsAsJson = JsonOutput.toJson(params)        def paramsAsJsonFromReadJson = readJSON text: paramsAsJson        params.attachments = paramsAsJsonFromReadJson.attachments.toString()    }    slackSend (params)}