Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON output with Groovy

Tags:

json

groovy

I have been experimenting with the groovy Jsonbuilder as you can see below trying to look at different ways to build JSON objects and arrays. After things started to make sense, I tried expanding to what is shown below. The question I have is, why does "content" show up in the json pretty string output? I actually have another json object displaying this.class information in json string outputs.

Any ideas? I'm new to this, so it could definitely be an obvious one.

def tt = ["test", "test1"]
def jjj = "jason"
def js3 = new groovy.json.JsonBuilder()
def js2 = new groovy.json.JsonBuilder(tt);
js3 hello: "$jjj", "$jjj": tt
def js4 = new groovy.json.JsonBuilder()
def result = js4([sdn: js3, openflow: js2, type: 3])
println js4.toPrettyString();

outputs:

{
    "sdn": {
        "content": {
            "hello": "jason",
            "jason": [
                "test",
                "test1"
            ]
        }
    },
    "openflow": {
        "content": [
            "test",
            "test1"
        ]
    },
    "type": 3
}
like image 527
jedelman Avatar asked Sep 26 '13 01:09

jedelman


People also ask

What is Groovy JSON JsonSlurper?

JsonSlurper. JsonSlurper is a class that parses JSON text or reader content into Groovy data structures (objects) such as maps, lists and primitive types like Integer , Double , Boolean and String .


1 Answers

The problem can be restated as...

why does this:

import groovy.json.*

def js3 = new JsonBuilder(["test", "test1"])
def js4 = new JsonBuilder(js3)
println js4.toString()

print:

{"content":["test","test1"]}

and this:

import groovy.json.*

def js3 = new JsonBuilder(["test", "test1"])
def js4 = new JsonBuilder(js3.content)
println js4.toString()

prints this (?) :

["test","test1"]

The short answer is that JsonBuilder has a member named content, which represents the payload. When one JsonBuilder absorbs another, we want to replace the payload, and not nest it. This line is the way to replace the payload:

def js4 = new JsonBuilder(js3.content)

Ultimately, this stems from the fact that JsonBuilder.toString() (code here) calls JsonOutput.toJson(object) (code here).

An exercise for the reader is to experiment with:

class MyBuilder {
    def content
}

def myB = new MyBuilder(content: ["test", "test1"])
println JsonOutput.toJson(myB)
println JsonOutput.toJson(myB.content)
like image 153
Michael Easter Avatar answered Nov 10 '22 20:11

Michael Easter