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.
Output
{
"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"
}
]
}