Groovy unable to generate json output as needed - json

I'm trying to generate the following JSON output in Groovy for one of my Jenkins Job.
Expected JSON
{
"svc-a": {
"type": "object",
"properties": {
"svcVersion": {
"type": "string",
"propertyOrder": 1,
"enum": ["No build", "1.0.0.59", "1.0.0.58"]
},
"skipConfigs": {
"type": "boolean",
"format": "checkbox"
}
}
},
"svc-b": {
"type": "object",
"properties": {
"svcVersion": {
"type": "string",
"propertyOrder": 1,
"enum": ["No build", "1.0.0.177", "1.0.0.176", "1.0.0.175"]
},
"skipConfigs": {
"type": "boolean",
"format": "checkbox"
}
}
}
}
I am looping through each service and getting the build number from Jenkins. For each service I am trying to generate the json along with the some additional header and appending it to map. Finally when build the json object from map exisiting json is treated as string.
MyCode.
#!/usr/bin/env groovy
import org.boon.Boon;
import groovy.json.JsonSlurper;
import groovy.transform.Field;
import groovy.json.JsonBuilder;
import groovy.json.*
def serviceList = [
"svc-a",
"svc-b"
]
def getBuildVersions(serviceName) {
def resultList = []
resultList.add(0,"No build")
def job = jenkins.model.Jenkins.instance.getAllItems().findAll { it.name.contains(serviceName) }
job.each { s ->
if (s.toString().contains("")) {
print s
def builds = s.getBuilds()
builds.each { t->
if((t.result).toString() == "SUCCESS" && !t.displayName.contains("SNAPSHOT") && !t.displayName.contains("config")){
resultList.add(t.displayName)
}
}
}
}
return resultList
}
def retVal = new HashMap<String, Map>()
for (svc in serviceList) {
def myBuilds = getBuildVersions(svc)
List ver = myBuilds.collect{ "'" + it + "'"}
def header = """
{"type": "object", "properties": { "svcVersion": { "type": "string", "propertyOrder": 1, "enum": $ver }, "skipConfigs": { "type": "boolean", "format": "checkbox" } } }
"""
def json = JsonOutput.toJson(header)
def result = new JsonSlurper().parseText(json)
// s = "'" + svc + "'"
retVal.put(svc, result)
}
def builder = new JsonBuilder()
sjson = JsonOutput.toJson(retVal)
return sjson
Received Output
{"svc-a":"\n{\"type\": \"object\", \"properties\": { \"svcVersion\": { \"type\": \"string\", \"propertyOrder\": 1, \"enum\": ['No build', '1.0.0.59', '1.0.0.58', '1.0.0.57', '1.0.0.56', '1.0.0.55', '1.0.0.54', '1.0.0.53', '1.0.0.52', '1.0.0.51', '1.0.0.49', '1.0.0.48', '1.0.0.47', '1.0.0.46', '1.0.0.45', '1.0.0.38', '1.0.0.37', '1.0.0.36', '1.0.0.35', '1.0.0.33', '1.0.0.31', '1.0.0.30', '1.0.0.29', '1.0.0.28', '1.0.0.27', '1.0.0.26', '1.0.0.25', '1.0.0.24', '1.0.0.22', '1.0.0.20', '1.0.0.19', '1.0.0.18', '1.0.0.17', '1.0.0.16', '1.0.0.13', '1.0.0.11', '1.0.0.8', '1.0.0.6', '1.0.0.5'] }, \"skipConfigs\": { \"type\": \"boolean\", \"format\": \"checkbox\" } } }\n","svc-b":"\n{\"type\": \"object\", \"properties\": { \"svcVersion\": { \"type\": \"string\", \"propertyOrder\": 1, \"enum\": ['No build', '1.0.0.177', '1.0.0.176', '1.0.0.175', '1.0.0.173', '1.0.0.172', '1.0.0.171', '1.0.0.170', '1.0.0.169', '1.0.0.167', '1.0.0.166', '1.0.0.165', '1.0.0.164', '1.0.0.163', '1.0.0.162', '1.0.0.158', '1.0.0.156', '1.0.0.38', '1.0.0.37', '1.0.0.36', '1.0.0.35', '1.0.0.33', '1.0.0.31', '1.0.0.29', '1.0.0.27'] }, \"skipConfigs\": { \"type\": \"boolean\", \"format\": \"checkbox\" } } }\n"}
When the Groovy Map is converted to JSON, json object in the values treated as one string.
How can get the properly formatted json output. I come from python background dont have mcuh idea on Groovy.

Found the solution by just using string manipulation
for (svc in serviceList) {
def myBuilds = getBuildVersions(svc)
List ver = myBuilds.collect{ '"' + it + '"'}
def header = """
"$svc": {"type": "object", "properties": { "svcVersion": { "type": "string", "propertyOrder": 1, "enum": $ver }, "skipConfigs": { "type": "boolean", "format": "checkbox" } } }
"""
if (firstRun == "true"){
retVal = header
} else {
retVal = retVal + "," + header
}
firstRun = "false"
}

Related

groovy to remove json unwated array label

I have this json and I want to remove the field item.
{ "field": "AAA", "list": { "item": [ { "field01": "111", "field02": "222" }, { "field01": "333", "field02": "444" } ] }}
I'm using this json slurper groovy but it's returnung null.
def myJson = '..' //above json; def jsonParser = new JsonSlurper(); def jsonObject=jsonParser.parseText(myJson); return JsonOutput.toJson(jsonObject["item"])
The expected output is:
{ "field": "AAA", "list": [ { "field01": "111", "field02": "222" }, { "field01": "333", "field02": "444" } ]}
How can I do to remove the field "item"?
def myJson = '..' //above json;
def jsonParser = new JsonSlurper();
def jsonObject=jsonParser.parseText(myJson);
jsonObject.list=jsonObject.list.item
return JsonOutput.toJson(jsonObject)

JSONBuilder in Groovy adds wrong quotation marks

I'm trying to read a json file, edit some parts of it and then parse it back to a json file. The goal is to change the value of a confluence page. I'm using the groovy code in a Jenkins pipeline. Here it is:
def changeValue(){
def json_map = readJSON file: '/tmp/updater.json'
def body_content = '{"storage":{"value":'
body_content += '"<h1>test</h1>"'
body_content += ',"representation":"storage"}}'
json_map.body = body_content
json_as_string = new JsonBuilder(json_map).toPrettyString().replaceAll("\\\\", "") // It also adds unneccesary escapes
print json_as_string
}
This is the contents of the updater.json:
{
"id":"redacted",
"type":"page",
"title":"redacted",
"space":{"key":"redacted"},
"body":{"storage":{"value":"<h1>wrong</h1>","representation":"storage"}},
"version":{
"number":6
}
}
That is what I get:
{
"id": "redacted",
"type": "page",
"title": "redacted",
"space": {
"key": "redacted"
},
"body": "{"storage":{"value":"<h1>test</h1>","representation":"storage"}}",
"version": {
"number": 6
}
}
As you can see, it added quotation marks around the block of the body. How can I get rid of them?
The result is as expected, you update the body with a new String.
If you want to update only the value use this based on this answer
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
def jsn = """
{
"id":"redacted",
"type":"page",
"title":"redacted",
"space":{"key":"redacted"},
"body":{"storage":{"value":"<h1>wrong</h1>","representation":"storage"}},
"version":{
"number":6
}
}"""
def slp= new JsonSlurper().parseText(jsn)
bld.content.body.storage.value = '<h1>test</h1>'
println(bld.toPrettyString())
result
{
"id": "redacted",
"type": "page",
"title": "redacted",
"space": {
"key": "redacted"
},
"body": {
"storage": {
"value": "<h1>test</h1>",
"representation": "storage"
}
},
"version": {
"number": 6
}
}

how to parse the json file and read the json elements in groovy

Hi i am trying to parse the below json file. I tried using jsonsluper and parsed the file. I executed below command. Nothing works.
def test =newjsonslurper().parsetext(organist)
test.resources.each{
println it.resources.metadata. "guid"
println it.resources.entity. "name"
}
This is the json file format
resources: [
{
"metadata" :{
"guid":"cya"
"url": "dummy.test"
},
"entity" :
{
"name": "system"
"status": "active"
}
}
{
"metadata" :
{
"guid":"cya"
"url": "dummy.test"
},
"entity" :
{
"name": "system"
"status": "active"
}
}
]
There were a couple of problems:
JsonSlurper().parseText() expects a String. If you're wanting to parse a file, use something like def response = new JsonSlurper().parse(new File('JsonFile.json'))
The JSON payload is not valid: it's missing a few brackets and commas.
The following code should work:
import groovy.json.JsonSlurper
def test = new JsonSlurper().parseText '''
{"resources": [
{
"metadata": {
"guid": "cya",
"url": "dummy.test"
},
"entity": {
"name": "system",
"status": "active"
}
},
{
"metadata": {
"guid": "cya",
"url": "dummy.test"
},
"entity": {
"name": "system",
"status": "active"
}
}
]}
'''
test.resources.each {
println it.metadata.guid
println it.entity.name
}

how to print json array in jsonobject when we will get element of jsonarrray at runtime

ArrayList al = new ArrayList();
//al[0] and al[1] are the json objects.
def json = new JsonBuilder()
json {
type "rel12"
total k
xyz ""
shows al[0],al[1]
emails ""
}
println json.toPrettyString()
i dont want to do the the hardcoding like al[0]. al[1].
but i need the output like
{
"type": "rel12",
"total": 2,
"xyz": "",
"shows": [
{
"extension": "zip",
"updateTime": 1477521104511
},
{
"extension": "zip",
"updateTime": 1477521104623
}
],
"emails": ""
}

Append json into a json in groovy

I am newbie to groovy. My requirement is i have to append a json into a json.My code as follows:
JSON constructed by me:
def builder = new groovy.json.JsonBuilder()
def root=builder.event{
type "model_output_load_init"
time new Timestamp(date.getTime())
status "success"
}
JSON from DB:
def json = rs.getString("status");
Now i have to append constructed into the JSON From DB. PLease help me to solve this.Thanks in advance.
EDIT:
My Constructed JSON:
{
"event": {
"type": "model_output_load_init",
"time": "2015-10-01T14:08:17+0000",
"status": "success"
}
}
JSON FROM DB:
{
"model_build": {
"Initialized": {
"Timestamp": ""
}
},
"modelExec": {
"Initialized": {
"Timestamp": ""
}
}
}
OUTPUT NEEDED:
{
"model_build": {
"Initialized": {
"Timestamp": ""
}
},
"modelExec": {
"Initialized": {
"Timestamp": ""
}
},
"event": {
"type": "model_output_load_init",
"time": "2015-10-01T14:08:17+0000",
"status": "success"
}
}
You can append to the Map generated by JsonSlurper.
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
def builder = new JsonBuilder()
def root = builder.event{
type "model_output_load_init"
time new Timestamp(date.getTime())
status "success"
}
// Simulates the JSON from DB
def json = new JsonSlurper().parseText('''
{
"model_build": {
"Initialized": {
"Timestamp": ""
}
},
"modelExec": {
"Initialized": {
"Timestamp": ""
}
}
}''')
// Append the built JSON to the "slurped" JSON
json.event = root.event
// Re-build the JSON so it can saved as a String
new JsonBuilder(json).toPrettyString()
The output looks like this:
{
"event": {
"type": "model_output_load_init",
"time": "2015-10-01T14:39:11+0000",
"status": "success"
},
"modelExec": {
"Initialized": {
"Timestamp": ""
}
},
"model_build": {
"Initialized": {
"Timestamp": ""
}
}
}