2013-01-18 52 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''选项 –

相关问题