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

时间:2016-02-18 17:08:50

标签: json grails groovy marshalling

我正在尝试使用spring的 ObjectMarshallerRegisterer bean注册自定义JSON编组器,如here所述。

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

到目前为止,我已经实现了这个注册为对象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()
    }
}

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

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

感谢。

1 个答案:

答案 0 :(得分:5)

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

上面代码中的一行:

jsonWriter.value(JSON.parse((value as JSON).toString()))

应替换为:

json.convertAnother(value);

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