2011-06-27 11 views
12

¿Hay alguna manera de eliminar el campo de clase en un convertidor JSON?Grails - grails.converters.JSON - eliminando el nombre de clase

Ejemplo:

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

como una cadena es

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

preferiría

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

¿Hay una manera de añadir una línea más de código al final de eliminar el campo de clase?

+0

Marque esta otra respuesta http://stackoverflow.com/questions/5538423/grails-jsonbuilder/5540471#5540471 – Maricel

Respuesta

12

Aquí hay una forma de hacerlo. He añadido un código siguiente a la clase de dominio:

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

Pero como descubrí si ha utilizado la anotación de clase maravillosa @ToString cuando también debe agregar 'clase' con el parámetro excluye, por ejemplo:

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

Una alternativa es no utilizar el constructor:

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

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

Esto es un poco menos ortogonal ya que había necesidad de cambiar su prestación si los cambios de los empleados; por otro lado, tienes más control sobre lo que se renderiza.

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

Mi forma preferida de hacer esto:

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) 
} 

esto devolverá todos los objetos de Book.getAllBoks(), pero el método de cobro revertido cambiará tODO en el formato que especifique.

1

@ La respuesta de wwarlock es en parte correcta, tengo que colocar el registerObjectMarshaller en Bootstrap, puede funcionar.

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) } 
     } 
    } 
} 

Esto funciona para mí. Puede pasar fácilmente cualquier propiedad para excluir. O darle la vuelta:

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) } 
     } 
    } 
} 

Cuidado: Esto es solo para objetos simples. Si ve "clave extraviada: modo esperado de KEY pero era OBJETO", esta solución no es para usted. :)

HP

+0

application/json debería ser el tipo de contenido correcto –

1

Puede personalizar los campos a ser excluidos (incluyendo el nombre de la clase), utilizando el método setExcludes proporcionada en el grails.converters.JSON

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

y luego, puede utilizar que al igual que de acuerdo a sus necesidades,

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