一、SpringMVC @RequestBody接收Json对象字符串
以前,一直以为在SpringMVC环境中,@RequestBody接收的是一个Json对象,一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,后来发现用
JSON.stringify(data)的方式就能将对象变成字符串。同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以轻易的将一个对象或者List传到Java端,使用@RequestBody即可绑定对象或者List.
下面一个例子需要大家注意:
JavaScript 代码:
<script type="text/javascript"> $(document).ready(function(){ test = function () {
var test = [{"userName":"test","address":"gz"},
{"userName":"ququ","address":"gr"}
];
jQuery.ajax({
url : cur_url+"/weekly/test",
type : 'post',
data : JSON.stringify(test),
dataType : 'json',
contentType:'application/json;charset=utf-8',
success : function (data, textStatus) {
console.info(data);
alert("test success!");
},
error:function(){
alert("test error!");
}
});
};
}); </script>
Java代码
@RequestMapping("/test")
@ResponseBody
public List<User> test(@RequestBody List<User> t) {
return t;
}
这样是不可以的。因为spring MVC不会自动转换为List<User>对象。传到后台后,List中是LinkedHashMap类型。
这时需要使用数组接受,如下:
@RequestMapping("/test") @ResponseBody public List<User> test(@RequestBody User[] t) { for (User user : t) { System.out.println("user:" + user); System.out.println("userName:" + user.getUserName()); System.out.println("address:" + user.getAddress()); } List<User> tt = Arrays.asList(t); for (int i = 0; i < tt.size(); i++) { User u = tt.get(i); System.out.println(i + "tt:" + u); } return tt; }
这样就可以正常接收ajax发送的json数组字符串,上面也演示了该数组可以转为list。这里数组名称t不用和前台test对应,只要前台传过来的数组中对象可以对应user对象就行。
这里返回的list<User>转为的json字符串,前台接收如下:
1 success : function (data, textStatus) { 2 console.info(data); 3 console.info(data.length); 4 for ( var i = 0; i < data.length; i++) { 5 console.info(i + ":" + data[i].address); 6 console.info(i + ":" + data[i].userName); 7 } 8 alert("test success!"); 9 },