加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 16:22:37 所属栏目:大数据 来源:网络整理
导读:有没有人知道使用最新版本的Grails JSONBuilder多次发出同一个对象时避免重复闭包的方法? 我有一个包含成员和领导者组的组域对象.我想找到一种方法来排放一个人,而无需切割和粘贴封闭物. def builder = new JSONBuilder() def result = builder.build { arr
有没有人知道使用最新版本的Grails JSONBuilder多次发出同一个对象时避免重复闭包的方法?

我有一个包含成员和领导者组的组域对象.我想找到一种方法来排放一个人,而无需切割和粘贴封闭物.

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:没有这样的属性:id for class:.

一些说明:

1)示例中的域对象大大简化.我正在使用JSONBuilder而不是将Group.list()渲染为JSON或渲染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的起源.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读