如何使用Groovy JsonBuilder生成具有嵌套同级的对象数组
我试图生成一个包含多个嵌套对象的JSON数组 以下是我想要生成的内容:(由于我需要数组,所以缩短了输出,如果您运行代码,这只会重复): 而是生成以下内容:如何使用Groovy JsonBuilder生成具有嵌套同级的对象数组,json,groovy,jsonbuilder,Json,Groovy,Jsonbuilder,我试图生成一个包含多个嵌套对象的JSON数组 以下是我想要生成的内容:(由于我需要数组,所以缩短了输出,如果您运行代码,这只会重复): 而是生成以下内容: [ { "User": { "Name": "Foo", "Email": "test@example.com" }, "Address": { "City":
[
{
"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吗?为什么不使用普通映射/数组?代码中的问题是,在函数详细信息之前需要调用函数地址?为什么不使用普通映射/数组?代码中的问题是,在函数详细信息