2017-07-15 124 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的不同的包)