2012-04-17 2 views
8

Я пытаюсь зарегистрировать пользовательскую JSon маршаллер как этогокак зарегистрировать пользовательский JSon маршаллер в Грааль

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 
      } 

, но я не уверен, что если мой заказ сериализатору используются, потому что, когда я не буду отладкой управления никогда идет к marshalObject функции моего пользовательского сериализатором

Мой заказ сериализатору является следующим

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


} 

можно ли отладить сек erializer? Если нет, то как я могу исключить свойство из сериализации? Есть некоторое свойство, которое выдает исключение во время сериализации.

+0

я решил ее импортировать несколько недостающих файлов, таких как BeanUtils и Модификатор –

ответ

9

это то, что я делаю для пользовательских JSON маршалинга в замыкании инициализации 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']) 
    }} 

вы видите, что у меня есть собственные marshallers для даты, использование, лиц, и роль класса

6

я нашел этот пост, пытаясь найти правильный способ регистрации маршаллера. Самая большая разница по сравнению с ответом Нилса заключается в том, что это решение оставляет BootStrap.groovy неповрежденным, что приятно.

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

+1

В статье вы связанный с ним, намного лучше, более чистый подход. Чтобы помочь справиться с гнилью ссылки, пожалуйста, подумайте о цитировании наиболее важных битов статьи здесь в вашем ответе. – cdeszaq

+0

Сайт, похоже, не работает в эти дни. – adeady

0

Чтобы настроить JSon сериализации, лучшие практики, чтобы использовать плагин Grails, например, следующее: http://grails.org/plugin/marshallers

Смежные вопросы