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的起源. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |