I would like to use closure way to make following json:
{
    "root": [
        {
            "key": "testkey",
            "value": "testvalue"
        }
    ]
}
I'm using following syntax:
new JsonBuilder().root {
        'key'(testKey)
        'value'(testValue)
}
But it produces:
{
    "root": {
        "key": "testkey",
        "value": "testvalue"
    }
}
                You can write something like below:
def json = new groovy.json.JsonBuilder()
json  { 
  root (
   [
       {
        key ('color')
        value ('orange')
     }
   ]
  )
}
println json.toPrettyString()
Notice how array is passed to root in the above.
Your example works correctly, because you pass a simple map for root key. You have to pass a list instead do produce expected output. Consider following example:
import groovy.json.JsonBuilder
def builder = new JsonBuilder()
builder {
    root((1..3).collect { [key: "Key for ${it}", value: "Value for ${it}"] })
}
println builder.toPrettyString()
In this example we pass a list of elements created with (1..3).collect {} to a root node. We have to split initialization from building a JSON body, because things like new JsonBuilder().root([]) or even builder.root([]) throw an exception, because there is no method that expects a parameter of type List. Defining list for node root inside the closure solves this problem.
{
    "root": [
        {
            "key": "Key for 1",
            "value": "Value for 1"
        },
        {
            "key": "Key for 2",
            "value": "Value for 2"
        },
        {
            "key": "Key for 3",
            "value": "Value for 3"
        }
    ]
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With