2012-04-17 2 views
8

ich ein benutzerdefinierte json Einweiser wie diese, wie ein benutzerdefinierten json Einweiser in Grails registriert

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 
      } 

registrieren versuchen, aber ich bin nicht sicher, ob meine benutzerdefinierten Serializer weil die verwendet wird, wenn ich Kontrolle bin Debuggen nie geht an marshalObject Funktion meines benutzerdefinierten Serializer

Mein individueller Serializer als

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


} 

folgt ist es möglich, die s zu debuggen Erializer? Wenn nicht, wie kann ich eine Eigenschaft von der Serialisierung ausschließen? Es gibt eine Eigenschaft, die während der Serialisierung eine Ausnahme auslöst.

+0

i löste es durch einige fehlende Dateien wie BeanUtils und Modifier –

Antwort

9

das ist, was ich in der Bootstrap init Verschluss für individuelle JSON Serialisieren tun:

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

Sie sehen, dass ich benutzerdefinierten Marshaller für das Datum, den Einsatz, Person, und Rollenklasse

6

ich gefunden habe diesen Beitrag, während Sie versuchen, einen richtigen Weg für die Registrierung des Marshallers zu finden. Der größte Unterschied zu Nils Antwort ist, dass diese Lösung BootStrap.groovy intakt lässt, was gut ist.

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

+1

Der Artikel, den Sie importieren Verbunden mit ist ein viel besserer, sauberer Ansatz. Um zu helfen, mit Link-Fäulnis umzugehen, ziehe bitte die relevantesten Teile des Artikels hier in deiner Antwort an. – cdeszaq

+0

Website scheint in diesen Tagen nicht verfügbar zu sein. – adeady

Verwandte Themen