2012-04-17 26 views
8

Tôi cố gắng để đăng ký một marshaller tùy chỉnh json như thế nàylàm thế nào để đăng ký một marshaller json tùy chỉnh trong grails

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 
      } 

nhưng tôi không chắc chắn nếu serializer tùy chỉnh của tôi đang được sử dụng bởi vì khi tôi gỡ lỗi kiểm soát không bao giờ đi vào marshalObject chức năng của serializer tùy chỉnh của tôi

serializer tùy chỉnh của tôi là như sau

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


} 

có thể gỡ lỗi s erializer? Nếu không thì làm thế nào tôi có thể loại trừ một tài sản từ serialization? Có một số tài sản mà ném ngoại lệ trong quá trình serialization.

+0

tôi giải quyết nó bằng cách nhập vài file đã mất như BeanUtils và Modifier –

Trả lời

9

đây là những gì tôi làm cho marshaling tùy chỉnh JSON trong Bootstrap init đóng cửa:

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

bạn thấy rằng tôi có marshallers tùy chỉnh cho các ngày, sử dụng, Person, và Vai trò lớp

6

tôi thấy bài đăng này trong khi cố gắng tìm ra cách thích hợp để đăng ký marshaller. Sự khác biệt lớn nhất so với câu trả lời của Nils là giải pháp này rời khỏi BootStrap.groovy còn nguyên vẹn.

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

+1

Bài viết bạn liên kết đến là một cách tiếp cận tốt hơn, sạch hơn. Để giúp giải quyết vấn đề liên kết, vui lòng xem xét trích dẫn các bit có liên quan nhất của bài viết ở đây trong câu trả lời của bạn. – cdeszaq

+0

trang web dường như không hoạt động trong những ngày này. – adeady

Các vấn đề liên quan