如何使用Groovy JsonBuilder生成具有嵌套同级的对象数组

如何使用Groovy JsonBuilder生成具有嵌套同级的对象数组,json,groovy,jsonbuilder,Json,Groovy,Jsonbuilder,我试图生成一个包含多个嵌套对象的JSON数组 以下是我想要生成的内容:(由于我需要数组,所以缩短了输出,如果您运行代码,这只会重复): 而是生成以下内容: [ { "User": { "Name": "Foo", "Email": "test@example.com" }, "Address": { "City":

我试图生成一个包含多个嵌套对象的JSON数组

以下是我想要生成的内容:(由于我需要数组,所以缩短了输出,如果您运行代码,这只会重复):

而是生成以下内容:

[
        {
            "User": {
                "Name": "Foo",
                "Email": "test@example.com"
            },
            "Address": {
                "City": "Anywhere",
                "Country": "USA",
                "State": "ID",
                "ZipCode": "55842"
            },
            "Details": [
                {
                    "FavoriteColor": "Blue"
                },
                {
                    "City": "Anywhere",
                    "Country": "USA",
                    "State": "ID",
                    "ZipCode": "55842"
                }
            ]
        }
    ]
def array = 1..3

def builder = new groovy.json.JsonBuilder()
builder array.collect { itemNumber ->
    [{
        User(
            Name: "Foo" + itemNumber,
            Email: "test@example.com"
        )
        Details(
            Address(
                City: "Anywhere",
                Country: "USA",
                State: "ID",
                ZipCode: "55842"
            ),
            FavoriteColor: "Blue"
        )
    }
    ]
}

println groovy.json.JsonOutput.prettyPrint(builder.toString())
这是我的代码:

[
        {
            "User": {
                "Name": "Foo",
                "Email": "test@example.com"
            },
            "Address": {
                "City": "Anywhere",
                "Country": "USA",
                "State": "ID",
                "ZipCode": "55842"
            },
            "Details": [
                {
                    "FavoriteColor": "Blue"
                },
                {
                    "City": "Anywhere",
                    "Country": "USA",
                    "State": "ID",
                    "ZipCode": "55842"
                }
            ]
        }
    ]
def array = 1..3

def builder = new groovy.json.JsonBuilder()
builder array.collect { itemNumber ->
    [{
        User(
            Name: "Foo" + itemNumber,
            Email: "test@example.com"
        )
        Details(
            Address(
                City: "Anywhere",
                Country: "USA",
                State: "ID",
                ZipCode: "55842"
            ),
            FavoriteColor: "Blue"
        )
    }
    ]
}

println groovy.json.JsonOutput.prettyPrint(builder.toString())

就像在评论中提到的那样,根据我的经验,最好在groovy中使用列表和映射,最后一步只转换为json。这样,您就可以使用groovy的所有优点来处理映射和列表(
collect
findAll
groupBy
,等等)来改变数据,然后作为最后一步生成json

示例代码:

import groovy.json.JsonOutput

def numbers = 1..3

def data = numbers.collect { n -> 
  [
    User: [
      Name: "Foo${n}", 
      Email: "test@example.com"
    ],
    Details: [
      Address: [
        City:     "Anywhere", 
        Country:  "USA", 
        State:    "ID", 
        ZipCode:  "55842"
      ],
      FavoriteColor: "Blue"
    ]
  ]
}

def json   = JsonOutput.toJson(data)
def pretty = JsonOutput.prettyPrint(json)
println "JSON:\n${pretty}"
运行时,它会生成:

─➤ groovy solution.groovy
JSON:
[
    {
        "User": {
            "Name": "Foo1",
            "Email": "test@example.com"
        },
        "Details": {
            "Address": {
                "City": "Anywhere",
                "Country": "USA",
                "State": "ID",
                "ZipCode": "55842"
            },
            "FavoriteColor": "Blue"
        }
    },
    {
        "User": {
            "Name": "Foo2",
            "Email": "test@example.com"
        },
        "Details": {
            "Address": {
                "City": "Anywhere",
                "Country": "USA",
                "State": "ID",
                "ZipCode": "55842"
            },
            "FavoriteColor": "Blue"
        }
    },
    {
        "User": {
            "Name": "Foo3",
            "Email": "test@example.com"
        },
        "Details": {
            "Address": {
                "City": "Anywhere",
                "Country": "USA",
                "State": "ID",
                "ZipCode": "55842"
            },
            "FavoriteColor": "Blue"
        }
    }
]

关于groovy中映射键的一个注意事项,我没有在上面引用我的,因为当您的键是有效标识符时(即不是像
最喜欢的颜色
),您不需要引用。如果遇到打破上述模式的键,则始终可以引用这些键

就像在评论中提到的那样,根据我的经验,最好在groovy中使用列表和映射,最后一步只转换为json。这样,您就可以使用groovy的所有优点来处理映射和列表(
collect
findAll
groupBy
,等等)来改变数据,然后作为最后一步生成json

示例代码:

import groovy.json.JsonOutput

def numbers = 1..3

def data = numbers.collect { n -> 
  [
    User: [
      Name: "Foo${n}", 
      Email: "test@example.com"
    ],
    Details: [
      Address: [
        City:     "Anywhere", 
        Country:  "USA", 
        State:    "ID", 
        ZipCode:  "55842"
      ],
      FavoriteColor: "Blue"
    ]
  ]
}

def json   = JsonOutput.toJson(data)
def pretty = JsonOutput.prettyPrint(json)
println "JSON:\n${pretty}"
运行时,它会生成:

─➤ groovy solution.groovy
JSON:
[
    {
        "User": {
            "Name": "Foo1",
            "Email": "test@example.com"
        },
        "Details": {
            "Address": {
                "City": "Anywhere",
                "Country": "USA",
                "State": "ID",
                "ZipCode": "55842"
            },
            "FavoriteColor": "Blue"
        }
    },
    {
        "User": {
            "Name": "Foo2",
            "Email": "test@example.com"
        },
        "Details": {
            "Address": {
                "City": "Anywhere",
                "Country": "USA",
                "State": "ID",
                "ZipCode": "55842"
            },
            "FavoriteColor": "Blue"
        }
    },
    {
        "User": {
            "Name": "Foo3",
            "Email": "test@example.com"
        },
        "Details": {
            "Address": {
                "City": "Anywhere",
                "Country": "USA",
                "State": "ID",
                "ZipCode": "55842"
            },
            "FavoriteColor": "Blue"
        }
    }
]

关于groovy中映射键的一个注意事项,我没有在上面引用我的,因为当您的键是有效标识符时(即不是像
最喜欢的颜色
),您不需要引用。如果遇到打破上述模式的键,则始终可以引用这些键

你真的需要jsonbuilder吗?为什么不使用普通映射/数组?代码中的问题是,在函数
详细信息
之前需要调用函数
地址
?为什么不使用普通映射/数组?代码中的问题是,在函数
详细信息