2013-01-18 57 views
1

的Json我想一個JSON數組傳遞給一個Grails控制器,然後到Java類。我無法弄清楚如何正確地將我的參數傳遞給Java類。這是相關代碼。作爲參數傳遞給Grails的控制器

AJAX POST:

$('#matrixForm').submit(function(e) { 
     e.preventDefault(); 

    var matrixArray = $(this).serializeArray(); 

    $.ajax({ 
     type: "POST", 
     data: matrixArray, 
     url: "/turingpages/factorize/create", 
     success: function(data) { 
      //USE DATA 
     } 
    }); 
    }); 

的Grails控制器:

... 
    def create() { 

     MatrixFactorization m = new MatrixFactorization(params) 
     Gson gson = new Gson() 
     def jsonMatrix = gson.toJson(m.answer) 
     render jsonMatrix 
    } 
... 

MatrixFactorization構造:

public MatrixFactorization(JsonElement jsonarray) { 
    BlockRealMatrix R = GsonMatrix.toMatrix(jsonarray); 
    this.run(R); 
} 

我的控制檯顯示我的JSON數組爲:

[{name:"00", value:"1"}, {name:"01", value:"2"}, {name:"02", value:"3"}, {name:"10", value:"4"}, {name:"11", value:"0"}, {name:"12", value:"4"}, {name:"20", value:"0"}, {name:"21", value:"4"}, {name:"22", value:"2"}] 

我的堆棧跟蹤是:

| Error 2013-01-18 00:30:23,792 [http-bio-8080-exec-4] ERROR errors.GrailsExceptionResolver - GroovyRuntimeException occurred when processing request: [POST] /turingpages/factorize/create - parameters: 
21: 4 
20: 0 
10: 4 
22: 2 
00: 1 
01: 2 
11: 0 
02: 3 
12: 4 
failed to invoke constructor: public matrices.MatrixFactorization(com.google.gson.JsonElement) with arguments: [] reason: java.lang.IllegalArgumentException: wrong number of arguments. Stacktrace follows: 
Message: failed to invoke constructor: public matrices.MatrixFactorization(com.google.gson.JsonElement) with arguments: [] reason: java.lang.IllegalArgumentException: wrong number of arguments 
    Line | Method 
->> 15 | create in turingpages.rest.MFController$$ENuqtska 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 195 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter 
|  63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 722 | run  in java.lang.Thread 

我很新的使用JSON。任何幫助表示讚賞。謝謝。

回答

3

1.

jQuery將通過這個數據作爲請求的參數,而不是JSON,默認情況下。所以你應該建立一個JSON字符串傳遞給jQuery。我可以推薦你JSON 3 library。在這種情況下,它會是:

$.ajax({ 
    type: "POST", 
    data: JSON.stringify(matrixArray), 
    url: "/turingpages/factorize/create", 
    success: function(data) { 
     //USE DATA 
    } 
}); 

2.

在服務器端,您也可以使用標準的Grails的JSON轉換器(但你可以使用GSON,如果你喜歡),看http://grails.org/Converters+Reference

在這種情況下,可以使用

def create() { 
    MatrixFactorization m = new MatrixFactorization(request.JSON) 
    render m.answer as JSON 
} 
+0

當我使用字符串化,我的request.JSON是一個空對象:'[15:52:12.302] { 「陣列」:[[1,2,3 ],[3,4,5],[5,6,7]]} @ HTTP://本地主機:8080/turingpages/JS/dataFeed.js:15 [15:52:12.499] POST HTTP://本地主機:8080/turingpages /分比化/創建[HTTP/1.1 200 OK 18毫秒] [15:52:12.528] {} @ HTTP://本地主機:8080/turingpages/JS/dataFeed.js:22' – dagilmore

+0

上述日誌是在請求和打印輸出之前打印的數組。在Grails的控制器,我簡單地返回request.JSON – dagilmore

+1

嘗試添加'的contentType:「應用/ json''和'數據類型:」 json''選項 –

相關問題