域类中的Grails JSON marshallers

时间:2014-12-04 10:48:40

标签: json grails

我知道在Grails中我可以为不同的用途定义不同的JSON marshallers和asign名称,这非常好。但是我在Bootstrap部分结束了很多代码,最后我在两个地方结束,我需要在域类更改时进行调整。

我认为这还不够好,我想知道是否有可能在域类本身中定义JSON marshallers。

你认为这是一个好习惯吗? ...你能提供最佳方法的建议吗?

谢谢,

2 个答案:

答案 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)]     
        }