我们正在尝试将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,这很繁琐且容易出错。
答案 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中给出了不同的包)