gpt4 book ai didi

grails - 使用 JSONBuilder 时如何消除剪切和粘贴闭包

转载 作者:行者123 更新时间:2023-12-01 01:30:55 25 4
gpt4 key购买 nike

有谁知道在使用最新版本的 Grails JSONBuilder 多次发出同一个对象时避免重复闭包的方法?

我有一个 Group包含 Members 集的域对象和 Leaders .我想找到一种方法来发射一个人而不必剪切和粘贴封闭。

    def builder = new JSONBuilder() 
def result = builder.build {
array {
Group.list().each { Group group ->
g = {
id = group.id
name = group.name

members = array {
group.members?.person?.sort().each { Person person ->
m = { // Person closure copy #1
id = person.id
firstName = person.firstName
lastName = person.lastName
}
}
}

leaders = array {
group.leaders?.person?.sort().each { Person person ->
l = { // Person closure copy #2
id = person.id
firstName = person.firstName
lastName = person.lastName
}
}
}
}
}
}
}

我曾尝试单独定义闭包,但这会导致错误,例如: exception: No such property: id for class: .

一些注意事项:

1) 示例中的域对象被大大简化。我正在使用 JSONBuilder 而不是 render Group.list() as JSONrender Group.list().encodeAsJSON因为我需要控制我的对象的哪些部分被编码。

2)我会接受解释为什么不能这样做的权威答案。

最佳答案

在使用闭包反复失败后,我有了一个解决方案。它不直接使用闭包,而是使用返回映射的闭包。

class Person { 
...

def toMap = {
def map = [:]
map["id"] = this.id
map["firstName"] = this.firstName
map["lastName"] = this.lastName
return map
}
}

def builder = new JSONBuilder()
def result = builder.build {
array {
Group.list().each { Group group ->
g = {
id = group.id
name = group.name

members = array {
group.members?.person?.sort().each { Person person ->
m(person.toMap())
}
}

leaders = array {
group.leaders?.person?.sort().each { Person person ->
l(person.toMap())
}
}
}
}
}
}
m(person.toMap())语法不直观,但它有效,让我避免重复自己。 This blog entry提供了详细信息并解释了当前 Grails JSONBuilder 的起源。

关于grails - 使用 JSONBuilder 时如何消除剪切和粘贴闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4957767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com