json - 如何在 grails 中注册自定义 json marshaller

标签 json grails groovy

我正在尝试注册一个像这样的自定义 json marshaller

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


}

是否可以调试序列化程序?如果不是,那么如何从序列化中排除属性?有一些属性会在序列化过程中引发异常。

最佳答案

这是我在 Bootstrap init 闭包中为自定义 JSON 编码(marshal)处理所做的:

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

你看到我有日期、使用、人员和角色类的自定义编码器

关于json - 如何在 grails 中注册自定义 json marshaller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10188643/

相关文章:

javascript - 幻灯片放映在图像加载时开始,但在所有图像下载完成后才会显示第一张图像

javascript - 简化/编码 JSON 复合键

javascript - 如何使用 AJV 创建自定义错误消息?

java - 有序列表或集合中的枚举

groovy - 如何在 Groovy 中将元素添加到列表中?

json - 具有多个匹配项的 JMESPath JSON 过滤器

grails - Grails:重定向操作

java - grails 帮助命令表现得很奇怪

grails - Grails 中的最大值和偏移量?

grails - 在 Groovy 中使用 "$"