Grails - grails.converters.JSON - 删除类名

时间:2011-06-27 16:02:40

标签: json serialization grails jsonserializer

有没有办法删除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"}

有没有办法在末尾再添加一行代码来删除类字段?

7 个答案:

答案 0 :(得分:12)

这是一种方法。 我在域类中添加了下一个代码:

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

但是我发现如果你还要使用Groovy @ToString类注释,你还必须添加'class'来排除参数,例如:

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

答案 1 :(得分: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()中的所有对象,但collect方法会将ALL更改为您指定的格式。

答案 2 :(得分:3)

另一种方法是不使用构建器:

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

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

由于您需要在员工更改时更改渲染,因此这种正交稍微不那么正确;另一方面,你可以更好地控制渲染的内容。

答案 3 :(得分: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())

答案 4 :(得分:1)

@wwarlock的答案部分正确,我必须把registerObjectMarshaller放在Bootstrap上,它可以工作。

答案 5 :(得分: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

答案 6 :(得分:1)

您可以使用grails.converters.JSON中提供的setExcludes方法自定义要排除的字段(包括类名)

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

然后,您可以根据您的要求使用它,

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