如何在Grails中实现自定义深度ObjectMarshaller <JSON>?

yli*_*ima 2 grails groovy json marshalling

我想注册一个自定义的JSON编组使用Spring的ObjectMarshallerRegisterer所描述的豆这里.

我的目的是在编组过程中大写所有实现某个接口的类的每个属性名称.

到目前为止,我已经实现了这个注册为对象marshaller的类:

import grails.converters.JSON

import org.codehaus.groovy.grails.web.converters.exceptions.ConverterException;
import org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller;

class MyMarshaller implements ObjectMarshaller<JSON> {

    @Override
    boolean supports(Object object) {
        object instanceof MyInterface
    }

    @Override
    void marshalObject(Object object, JSON json)
            throws ConverterException {
        def jsonWriter = json.writer

        jsonWriter.object()
        object.class.metaClass.properties.each {
            jsonWriter.key(it.name.capitalize())
            def value = object."${it.name}"
            if(value == null || value instanceof Boolean ||
                    value instanceof Number || value instanceof String) {
                jsonWriter.value(value)
            } else {
                // TODO: Fix this
                jsonWriter.value(JSON.parse((value as JSON).toString()))
            }
        }
        jsonWriter.endObject()
    }
}
Run Code Online (Sandbox Code Playgroud)

这个类实际上有效,但我必须插入这一行jsonWriter.value(JSON.parse((value as JSON).toString()))作为快速修复.

好吧,将对象转换为String然后解析它不是一个好策略.必须有一个更好的方法来做到这一点.你们能帮助我吗?

谢谢.

yli*_*ima 5

好吧,我在github上搜索了一些grails的源代码,以了解它是如何在默认的Marshallers上完成的.这个给了我答案:

上面代码中的行:

jsonWriter.value(JSON.parse((value as JSON).toString()))
Run Code Online (Sandbox Code Playgroud)

应该替换为:

json.convertAnother(value);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的文档并不清楚.
希望这可以帮助其他人解决同样的问题.