Grails - grails.converters.JSON - удаление имени класса
Есть ли способ удалить поле класса в конверторе 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"}
Есть ли способ добавить еще одну строку кода в конец, чтобы удалить поле класса?
Ответы
Ответ 1
Вот еще один способ сделать это.
Я добавил следующий код в класс домена:
static {
grails.converters.JSON.registerObjectMarshaller(Employee) {
return it.properties.findAll {k,v -> k != 'class'}
}
}
Но, как я понял, если вы использовали аннотацию класса Groovy @ToString, когда вы также должны добавить "класс", чтобы исключить параметр, например:
@ToString(includeNames = true, includeFields = true, excludes = "metaClass,class")
Ответ 2
Мой предпочтительный способ сделать это:
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 в указанный вами формат.
Ответ 3
Один из вариантов заключается в том, чтобы не использовать конструктор:
def myAction = {
def emp = new Employee()
emp.lastName = 'Bar'
render(contentType: 'text/json') {
id = emp.id
lastName = emp.lastName
}
}
Это немного меньше ортогонально, поскольку вам нужно изменить рендеринг, если Employee изменится; с другой стороны, у вас больше контроля над тем, что получает.
Ответ 4
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())
Ответ 5
@wwarlock ответ отчасти прав, я должен поместить registerObjectMarshaller в Bootstrap, он может работать.
Ответ 6
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) }
}
}
}
Остерегайтесь: это только для простых объектов. Если вы видите "Misplaced key: ожидаемый режим KEY, но OBJECT", это решение не для вас.:)
HP
Ответ 7
Вы можете настроить исключенные поля (включая имя класса), используя метод setExcludes, предоставленный в grails.converters.JSON
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)