2012-04-17 25 views
8

我想註冊一個自定義的JSON編組這樣如何註冊Grails中自定義的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); 
     } 
    } 


} 

是否有可能調試的S erializer?如果沒有,那我該如何從序列化中排除一個屬性?有一些屬性在序列化期間拋出異常。

+0

我解決它通過導入一些丟失的文件一樣的BeanUtils和修改 – 2012-04-17 10:50:48

回答

9

這是我在引導初始化關閉自定義JSON編組做:

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

我發現這篇文章雖然試圖找出編組人員註冊的正確方法。與Nils的答案相比,最大的區別在於,該解決方案使BootStrap.groovy完好無損,這很好。

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

+1

你的文章鏈接到一個更好,更乾淨的方法。爲了幫助處理鏈接腐爛,請考慮在你的答案中引用文章中最相關的部分。 – cdeszaq 2012-08-22 13:41:02

+0

網站似乎是這些天。 – adeady 2017-04-20 13:44:04