有没有办法删除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 :(得分: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)
答案 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)