Grails 转换器 JSON 在实例上编组

Grails converters JSON Marshalling on a Instance

在 Grails JSON 转换器上下文中,希望转换 JSON 作为 MongoDB 查询结果的数据(结果没有关联的域对象)。

其中一个字段需要转换(即具有货币符号的字段需要通过剥离货币符号转换为数字)。

在这种情况下,是否可以仅将编组器应用于此实例数据。

使用:

JSON.registerObjectMarshaller(JSONObject)

全局应用于代码中所有其他位置的所有 JSON对象。

我不希望为此目的创建域对象,并希望使用 grails 转换器对象,例如 JSONObject 等

是的,您可以使用命名编组器轻松实现它。即在 Bootstrap.groovy:

中使用相同的命名空间注册你的编组器
JSON.createNamedConfig("foo") {
    it.registerObjectMarshaller(new CustomDataMarshaller)
}

编组器代码:

class CustomDataMarshaller implements ObjectMarshaller<JSON> {

    @Override
    boolean supports(Object object) {
        return object instanceof Currency   // Or directly BasicDbObject if you want to marshall the whole MongoDb result
    }

    @Override
    void marshalObject(Object object, JSON converter) throws ConverterException {
        // Convert here
    }
}

现在仅在您想使用它的地方使用此编组器,即用于任何特定实例或从 MongoDB 调用返回的结果:

class MyController {

    def test() {
        def data // Any data as you want to marshal

        JSON.use("foo") {
            respond(data)
            // OR
            // render(data as JSON)
        }
    }
}