2014-01-07 45 views
6

我在我的grails应用程序中有一个域类Person,我需要根据上下文以不同形式(JSON)输出。Grails - 如何取消注册已注册的对象编组器

在一个情况下,我只需要呈现几个字段(比如ID和名称)。在另一种情况下,我想渲染更多(身份证,姓名,凭证,年龄等)。我想知道是否有可能在使用后立即注销特定的编组人员。

基本上我正在寻找的是这样的:

------------------------------------------------------------- 

// context #1 
JSON.registerObjectMarshaller(Person) { 
    ... output just id and name 
} 

render myPerson as JSON 

JSON.unregisterObjectMarshaller(Person) // how do i do this? 

------------------------------------------------------------- 

// context #2 
JSON.registerObjectMarshaller(Person) { 
    ... output all fields 
} 

render myPerson as JSON 

JSON.unregisterObjectMarshaller(Person) // how do i do this? 

------------------------------------------------------------- 

注:我可以创建人2级空的子类,然后为每个注册的独立Marshallers。作为上下文的数量增加虚拟子类的数量也将上升。这是非常不洁的伊莫。

回答

17

您可能想使用称为命名配置而不是“交换”marshallers。你可以用这个成一个整齐的类/效用,但地方(如BootStrap.groovy中),这样做:

JSON.createNamedConfig('thin') { 
    it.registerObjectMarshaller(Person) { Person person -> 
     return [ 
      id: person.id, 
      name: person.name, 
     ] 
    } 
} 

JSON.createNamedConfig('full') { 
    it.registerObjectMarshaller(Person) { Person person -> 
     return [ 
       id: person.id, 
       name: person.name, 
       age: person.age 
     ] 
    } 
} 

然后,控制器,你可以选择要显示的编组人的风格:

// Show lots of stuff 
JSON.use('full') { 
    render people as JSON 
} 

// Show less stuff 
JSON.use('thin') { 
    render people as JSON 
} 
+1

+1这是美丽的。而且很干净。谢谢。我会把它放进去,让你知道它是怎么回事。 – techfoobar

+0

工作很好。谢谢。 :) – techfoobar

+0

很高兴解决,有一个很好的。 –