我有一个包含成员和领导者组的组域对象.我想找到一种方法来排放一个人,而无需切割和粘贴封闭物.
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的起源.
总结以上是内存溢出为你收集整理的grails – 如何在使用JSONBuilder时消除剪切和粘贴闭包全部内容,希望文章能够帮你解决grails – 如何在使用JSONBuilder时消除剪切和粘贴闭包所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)