我知道在Grails中我可以为不同的用途定义不同的JSON marshallers和asign名称,这非常好。但是我在Bootstrap部分结束了很多代码,最后我在两个地方结束,我需要在域类更改时进行调整。
我认为这还不够好,我想知道是否有可能在域类本身中定义JSON marshallers。
你认为这是一个好习惯吗? ...你能提供最佳方法的建议吗?
谢谢,
答案 0 :(得分:2)
我专门为此目的写了plugin。它允许您在域类中使用注释,如下所示:
import grails.plugins.jsonapis.JsonApi
class User {
static hasMany = [
pets: Pet
]
@JsonApi
String screenName
@JsonApi('userSettings')
String email
@JsonApi(['userSettings', 'detailedInformation', 'social'])
String twitterUsername
@JsonApi(['detailedInformation', 'userSettings'])
Set pets
String neverGetsSerialized
@JsonApi('detailedInformation')
Integer getNumberOfTicklyAnimals() {
pets.count { it.likesTickling }
}
}
在您的控制器中,您将调用JSON.use('detailedInformation')
来激活特定的编组程序。
答案 1 :(得分:1)
在Bootstrap.groovy中编写此代码:
JSON.registerObjectMarshaller(YourClass) { YourClass yourClass->
Map result = [:]
result['yourClass.property'] = yourClass.property
def domain = new DefaultGrailsDomainClass(YourClass)
domain.persistentProperties.each { GrailsDomainClassProperty property, String propertyName = property.name ->
result[propertyName] = yourClass[(propertyName)]
}
return result
}
下面的代码添加一个属性,您可以根据需要命名
result['yourClass.property'] = yourClass.property
此代码按名称添加所有属性以映射:
domain.persistentProperties.each { GrailsDomainClassProperty property, String propertyName = property.name ->
result[propertyName] = yourClass[(propertyName)]
}