2017-07-15 96 views
0

我们正在试图获得一个Grails 2.5项目的Grails工作3.3grails 3.3渲染JSON破碎?

我们有一个JSON API,即contolers与JSON正是如此回应:

  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

通过源代码探索,似乎grails 3已经将负责JSON渲染的类改为StreamingJsonBuilder。这有些不同的语法,打破了现有的2.5代码。可悲的是,渲染文档和示例仍然是“旧”格式。

有两种选择:

1使用新的格式,e.g:

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一起工作,这可以节省大量代码。

自定义对象编组看起来是这样的:

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

,你把他们放在你BootStrap.groovy中(这是从的conf来初始化移动并给予在3.x的不同的包)