使用Spring MVC将JSON数组转换为java List <string> </string>

时间:2013-03-23 13:13:28

标签: jquery json spring-mvc

我的javascript代码中有一个字符串列表,我通过JQuery发送到基于REST的服务,如下所示:

var ids = []; 
$("input:checked").each(function() {
    ids.push(this.id);
});
var selectedIds = JSON.stringify(ids);
$.post("/todonotes/tasks/removeTask", selectedIds,function(e) {
}, "json");

如您所见,我将javascript数组转换为JSON数组。

现在,在服务器端,我使用Spring MVC和Jackson来接收和解析输入JSON:

@RequestMapping(value="/tasks/removeTask", method = RequestMethod.POST)
public @ResponseBody String removeTask(@RequestBody List<String> selectedIds) {
    ...
}

但我总是得到:

HTTP Status 415 - 

--------------------------------------------------------------------------------

type Status report message 

description The server refused this request because the request entity is in a format     not supported by the requested resource for the requested method.

我尝试从JSON对象中删除引号,并尝试使用@RequestParam但没有成功。

根据OQJF建议更新:

我修改了我的帖子请求,如下所示:

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds},function(e) {  
}, "json");

现在调用我的控制器方法,但每个List元素都填充了双引号和括号。这是List参数:

[["15", "21"]]

所以,例如第一个元素如下:

["15"

我不想解析String的每个List元素。

我也尝试删除JSON.stringify转换,但我的控制器甚至没有被调用。有了这个,我得到了:

HTTP Status 400 - Required List parameter 'selectedIds' is not present

--------------------------------------------------------------------------------

type Status report

message Required List parameter 'selectedIds' is not present

description The request sent by the client was syntactically incorrect.

更新

我尝试创建一个对象来保存我的ID,如下所示:

public class TaskIdHolder {

    private String[] selectedIds;

    public String[] getSelectedIds() {
        return selectedIds;
    }

    public void setSelectedIds(String[] selectedIds) {
        this.selectedIds = selectedIds;
    }
}

然后我修改了我的控制器方法签名:

public @ResponseBody String removeTask(@RequestBody TaskIdHolder selectedIds) {

我的JSON请求如下所示:

{"selectedIds":["15"]}

我还根据Andrei的建议修改了我的Jquery代码:

var data = JSON.stringify({selectedIds:selectedIds});
$.post("/todonotes/tasks/removeTask", data, function(e) {

其中selectedIds是一个JavaScript数组。

但现在我明白了:

POST http://localhost:8080/todonotes/tasks/removeTask 415 (Unsupported Media Type) 

3 个答案:

答案 0 :(得分:4)

我知道您不需要使用JSON.stringify(),,您的代码可能是这样的:

var ids = []; 
$("input:checked").each(function() {
    ids.push(this.id);
});

$.post("/todonotes/tasks/removeTask", $.param({'id': ids}, true),function(e) {
}, "json");

在服务器端,您应指定值:

public methodName(@RequestParam("id") List<String> selectedIds)

答案 1 :(得分:3)

尝试以下操作,无需更改控制器的方法签名或创建一个对象来保存您的ID。

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds.join(',')},function(e) {  
}, "json");

通过这种方式,如果您将请求参数声明为selectedIds: id1,id2,id3String[],那么您将发送List<String>这样的ID,这就是Controller期望它们的效果。两种情况)。

答案 2 :(得分:2)

尝试为request参数指定一个显式名称:

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds},...

<强>更新即可。您还可以尝试将整个请求数据对象字符串化为JSON:

var data = {selectedIds: selectedIds};
$.post("/todonotes/tasks/removeTask", JSON.stringify(data),...