2014-01-07 178 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

很高興解決,有一個很好的。 –