2012-04-17 17 views
8

Estoy intentando registrar un contador de referencias JSON personalizado como estecómo registrar un contador de referencias JSON personalizada en griales

JSON.createNamedConfig("dynamic",{ 
      def m = new CustomJSONSerializer() 
      JSON.registerObjectMarshaller(Idf, 1, { instance, converter -> m.marshalObject(instance, converter) }) 
      }) 

and then using it like this 

    JSON.use("dynamic"){ 
      render inventionList as JSON 
      } 

pero no estoy seguro de si se está utilizando mi serializador personalizado porque cuando estoy depurando control nunca va a marshalObject función de mi serializador personalizado

mi serializador personalizado es el siguiente

import grails.converters.deep.JSON 
import java.beans.PropertyDescriptor 
import java.lang.reflect.Field 
import java.lang.reflect.Method 
import org.codehaus.groovy.grails.web.converters.exceptions.ConverterException 
import org.codehaus.groovy.grails.web.converters.marshaller.json.GroovyBeanMarshaller 
import org.codehaus.groovy.grails.web.json.JSONWriter 

class CustomJSONSerializer extends GroovyBeanMarshaller{ 
    public boolean supports(Object object) { 
     return object instanceof GroovyObject; 
    } 

    public void marshalObject(Object o, JSON json) throws ConverterException { 
     JSONWriter writer = json.getWriter(); 
     println 'properties '+BeanUtils.getPropertyDescriptors(o.getClass()) 
     for(PropertyDescriptor property:BeanUtils.getProperyDescriptors(o.getClass())){ 
       println 'property '+property.getName() 
      } 
     try { 
      writer.object(); 
      for (PropertyDescriptor property : BeanUtils.getPropertyDescriptors(o.getClass())) { 
       String name = property.getName(); 
       Method readMethod = property.getReadMethod(); 
       if (readMethod != null && !(name.equals("metaClass")) && readMethod.getName()!='getSpringSecurityService') { 
        Object value = readMethod.invoke(o, (Object[]) null); 
        writer.key(name); 
        json.convertAnother(value); 
       } 
      } 
      for (Field field : o.getClass().getDeclaredFields()) { 
       int modifiers = field.getModifiers(); 
       if (Modifier.isPublic(modifiers) && !(Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers))) { 
        writer.key(field.getName()); 
        json.convertAnother(field.get(o)); 
       } 
      } 
      writer.endObject(); 
     } 
     catch (ConverterException ce) { 
      throw ce; 
     } 
     catch (Exception e) { 
      throw new ConverterException("Error converting Bean with class " + o.getClass().getName(), e); 
     } 
    } 


} 

¿es posible depurar los s ¿erializador? Si no es así, ¿cómo puedo excluir una propiedad de la serialización? Hay algunas propiedades que arrojan excepciones durante la serialización.

+0

Lo resuelto mediante la importación de algunos archivos que faltan como BeanUtils y modificador –

Respuesta

9

esto es lo que hago para el cálculo de referencias JSON personalizada en el cierre init Bootstrap:

def init = {servletContext -> 
    grailsApplication.domainClasses.each {domainClass -> 
     domainClass.metaClass.part = {m -> 
      def map = [:] 
      if (m.'include') { 
       m.'include'.each { 
        map[it] = delegate."${it}" 
       } 
      } else if (m.'except') { 
       m.'except'.addAll excludedProps 
       def props = domainClass.persistentProperties.findAll { 
        !(it.name in m.'except') 
       } 
       props.each { 
        map['id'] = delegate.id 
        map[it.name] = delegate."${it.name}" 
       } 
      } 
      return map 
     } 



    } 
    JSON.registerObjectMarshaller(Date) { 
     return it?.format("dd.MM.yyyy") 
    } 
    JSON.registerObjectMarshaller(User) { 
     def returnArray = [:] 
     returnArray['username'] = it.username 
     returnArray['userRealName'] = it.userRealName 
     returnArray['email'] = it.email 
     return returnArray 
    } 
    JSON.registerObjectMarshaller(Role) { 
     def returnArray = [:] 
     returnArray['authority'] = it.authority 
     return returnArray 
    } 
    JSON.registerObjectMarshaller(Person) { 
     return it.part(except: ['fieldX', 'fieldY']) 
    }} 

ves que tengo señaleros personalizados para la fecha, la utilización, la persona, y la Clase Rol

6

encontré esta publicación mientras intentaba encontrar una forma adecuada para el registro de Marshaller. La mayor diferencia en comparación con la respuesta de Nils es que esta solución deja BootStrap.groovy intacto, lo cual es bueno.

http://compiledammit.com/2012/08/16/custom-json-marshalling-in-grails-done-right/

+1

El artículo que vinculado a es un enfoque mucho mejor y más limpio. Para ayudar a lidiar con la podredumbre del enlace, considere citar los fragmentos más relevantes del artículo aquí en su respuesta. El sitio – cdeszaq

+0

parece estar inactivo en estos días. – adeady

Cuestiones relacionadas