grails 3.3渲染JSON坏了吗?

时间:2017-07-15 17:16:58

标签: json grails

我们正在尝试将grails 2.5项目用于grails 3.3

我们有一个json API,即具有JSON响应的contolers:

            log.info("about to return json")
            render(status: 200, contentType: 'application/json') {
                [
                    'result': 9999,
                    'message': "hello"
                ]
            }

问题是输出总是“{}”。这是控制器方法的最后一个代码。

如果我们这样做:

 render("hello")

我们得到“你好”。

如果我们这样做:

    render(status: 200, contentType: 'application/json') {
                    result = 0
                    player = "hello"
            }

我们也总是得到“{{}”,这看起来很疯狂!

有什么想法吗?这是否在Grails 3.3中被打破?这个代码在grails 2.5中完美运行

目前,我们可以找到的唯一解决方案是使用字符串连接手动呈现JSON,这很繁琐且容易出错。

1 个答案:

答案 0 :(得分:1)

仔细阅读源代码,似乎grails 3已经将负责JSON渲染的类更改为StreamingJsonBuilder。这有着略微不同的语法,破坏了现有的2.5代码。遗憾的是,渲染文档和示例仍然具有“旧”格式。

有两种选择:

1使用新格式,例如:

render(status: 200, contentType: 'application/json') {
       result 0
       player "hello"
}

这样做的缺点是它不适用于自定义对象Marshallers。

2使用JSONBuilder,例如

def builder = new JSONBuilder()
def json = builder.build {
        result= "0"
        player= "hello"
 }
 render(status: 200, contentType: 'application/json', text: json)

这有两个优点:它适用于Grails 2.5和3.x,因此可以使用grails 4.x.此外,它与Object Marshallers一起使用,可以节省大量代码。

自定义对象marshaller看起来像这样:

    DecimalFormat df = new DecimalFormat("##0.00");
    JSON.registerObjectMarshaller(Account) {
        return [balance: df.format(it.balance), currencyIso: it.currencyIso, id: it.id]
    }

然后你把它们放在你的bootstrap.groovy中(从conf转移到init并在3.x中给出了不同的包)