2011-06-27 58 views
12

有沒有辦法在JSON轉換器中刪除類字段?Grails - grails.converters.JSON - 刪除類名

例子:

import testproject.* 
import grails.converters.* 
emp = new Employee() 
emp.lastName = "Bar" 
emp as JSON 

爲字符串是

{"class":"testproject.Employee","id":null,"lastName":"Bar"} 

我寧願

{"id":null,"lastName":"Bar"} 

有沒有辦法在月底添加一行代碼刪除類字段?

+0

入住這對方的回答http://stackoverflow.com/questions/5538423/grails-jsonbuilder/5540471#5540471 – Maricel

回答

12

這裏還有一種方法可以做到這一點。 我已經添加了一個代碼域類:

static { 
    grails.converters.JSON.registerObjectMarshaller(Employee) { 
    return it.properties.findAll {k,v -> k != 'class'} 
    } 
} 

但因爲我發現,如果你已經使用Groovy的@ToString類註釋,當你還必須添加「類」,以排除參數,如:

@ToString(includeNames = true, includeFields = true, excludes = "metaClass,class") 
3

一種替代方法是不使用生成器:

def myAction = { 
    def emp = new Employee() 
    emp.lastName = 'Bar' 

    render(contentType: 'text/json') { 
     id = emp.id 
     lastName = emp.lastName 
    } 
} 

這是少了幾分正交,因爲你需要改變你的渲染,如果員工的變化;另一方面,你可以更好地控制渲染的內容。

1
import testproject.* 
import grails.converters.* 
import grails.web.JSONBuilder 

def emp = new Employee() 
emp.lastName = "Bar" 

def excludedProperties = ['class', 'metaClass'] 

def builder = new JSONBuilder.build { 
    emp.properties.each {propName, propValue -> 

    if (!(propName in excludedProperties)) { 
    setProperty(propName, propValue) 
    } 
} 

render(contentType: 'text/json', text: builder.toString()) 
7

我這樣做的首選方式:

def getAllBooks() { 
    def result = Book.getAllBooks().collect { 
     [ 
      title: it.title, 
      author: it.author.firstname + " " + it.author.lastname, 
      pages: it.pageCount, 
     ] 
    } 
    render(contentType: 'text/json', text: result as JSON) 
} 

這將返回所有從Book.getAllBoks()的對象,但收集方法會改變所有到您指定的格式。

1

@ wwarlock的答案是部分正確的,我必須將registerObjectMarshaller放在Bootstrap上,它可以工作。

1
def a = Employee.list() 

String[] excludedProperties=['class', 'metaClass'] 
render(contentType: "text/json") { 
    employees = array { 
     a.each { 
      employee it.properties.findAll { k,v -> !(k in excludedProperties) } 
     } 
    } 
} 

這適用於我。您可以輕鬆通過任何屬性進行排除。或轉過身來:

def a = Employee.list() 

String[] includedProperties=['id', 'lastName'] 
render(contentType: "text/json") { 
    employees = array { 
     a.each { 
      employee it.properties.findAll { k,v -> (k in includedProperties) } 
     } 
    } 
} 

注意:這隻適用於簡單的物體。如果您看到「錯位鍵:KEY的預期模式但是OBJECT」,此解決方案不適合您。 :)

HP

+0

應用/ JSON應該是正確的內容類型 –

1

可以使用在grails.converters.JSON

def converter = emp as JSON 
converter.setExcludes(Employee.class, ["class",""]) 

,然後提供的setExcludes方法自定義要排除的字段(包括類名),你可以使用它只是根據你的要求來樣,

println converter.toString() 
converter.render(new java.io.FileWriter("/path/to/my/file.xml")) 
converter.render(response)