2013-05-22 90 views
1

我試圖在控制器中檢索從客戶端(通過ajax)以JSON格式發送的複雜對象,但我不知道如何從params中獲取轉換某些屬性的映射。如何從Grails控制器中的params中獲取映射?

例如,想象這就是「複雜」的JSON對象(在元對象的項目數是可變的,可以是一個,兩個,三個......和變量名):

{ 
    language: "java", 
    meta: { 
     category: "category1" 
    } 
} 

當這個對象是通過jQuery發送,在控制器我得到這個params對象:

[language:java, meta[category]:category1, action: register, controller: myController] 

這就是我如何通過jQuery發送的對象。我有幾個電話一個共同的功能:

if (!params) params = {}; 

var url = this.urls.base+"/"+controller+"/"+action+"?callback=?"; 
if (params.callback) 
    url = this.urls.base+"/"+controller+"/"+action+"?callback="+params.callback; 
url = url + "&_"+new Date(); 
delete params.callback; 
$.ajax({ 
    url: url, 
    data: params, 
    crossDomain:true, 
    dataType:'jsonp', 
    cache:false, 
    ajaxOptions: {cache: false}, 
    jsonp: params.callback?false:true 
}); 

和params用於在Ajax調用我的測試,我

如果我嘗試做params.meta控制器以前寫的JSON對象發送,我得到一個空對象。 我該如何從params對象中檢索映射?

+0

你怎麼發這個對象,在客戶端? –

+0

看到我編輯的問題 – Eylen

回答

4

在客戶端,您必須使用POST方法發送數據,並將jQuery配置爲將其作爲JSON發送。像:

data = { 
    language: "java", 
    meta: { 
     category: "category1" 
    } 
} 
$.ajax({ 
    type: 'POST', 
    data: JSON.stringify(data), 
    contentType: 'application/json', 
}) 

,並獲得服務器端爲request.JSON看到文檔:http://grails.org/doc/2.2.0/ref/Servlet%20API/request.html

但是,如果你需要做跨域請求,POST方法是行不通的。在這種情況下,您可以將複雜對象作爲參數傳遞,並從字符串解析服務器。像:

$.ajax({ 
    data: {myjson: JSON.stringify(data)} 
}) 

和:

def myjson = JSON.parse(params.myjson) 
+0

謝謝,第二個選項效果很好!我希望有一個直接的方法,類似於params.getMap()類似於params.getList(),但我想這個選項是好的,並沒有引入太多的手動轉換(這是我的另一種選擇,做它手動) – Eylen

相關問題