使用spring mvc,Controller参数传参时,参数为一个对象的,在执行请求的时候,能够传递json数据,而后spring会自动解析json数据,并封装到这个对象中。html
好比下面这段代码:ajax
@RequestMapping(value = "json2Bean", consumes = "application/json", method = RequestMethod.POST) public CoreRole json2Bean(@RequestBody CoreRole role) { logger.info("【json2List测试】role = {}", role.toString()); return role; }
请求代码:spring
$(function(){ var data = {"code":"2","roleName":"大哥"} $.ajax({ url:'/coreRole/json2Bean.do', data:JSON.stringify(data), type:'POST', dataType:'json', contentType: "application/json;charset=UTF-8", success:function(data){ alert(JSON.stringify(data)); }, error:function(){ alert('error'); } }); })
可是有时候,咱们须要的数据是一个对象的集合,好比批量添加数据,咱们的参数多是List<?>。json
查阅过一些资料,说spring mvc不支持将一个json数据直接封装成List对象集合。mvc
但是如今项目中就有这样的需求,因此我抽时间作了测试,经测试,使用@RequestBody是能够作到这一步的。app
PS:项目中使用fastjson 1.2.7版本,在spring mvc的配置文件中配置了一个convert。测试
好了,废话很少说,上代码url
fastjson依赖:spa
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version> </dependency>
spring mvc的配置文件:code
<!-- 使用 fastjson替换默认jackson ,此配置请参考http://www.cnblogs.com/exmyth/p/4563673.html --> <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <!-- 配置Fastjson支持 --> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> <!-- QuoteFieldNames-输出key时是否使用双引号,默认为true WriteMapNullValue-是否输出值为null的字段,默认为false WriteNullNumberAsZero-数值字段若是为null,输出为0,而非null WriteNullListAsEmpty-List字段若是为null,输出为[],而非null WriteNullStringAsEmpty-字符类型字段若是为null,输出为"",而非null WriteNullBooleanAsFalse-Boolean字段若是为null,输出为false,而非null --> <property name="features"> <list> <!-- <value>WriteMapNullValue</value> --> <value>QuoteFieldNames</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
Controller代码:
@RequestMapping(value = "json2List", consumes = "application/json", method = RequestMethod.POST) public List<CoreRole> json2List(@RequestBody List<CoreRole> roles) { logger.info("【json2List测试】role = {}", roles.toString()); return roles; }
ajax代码:
$(function(){ var dataAry=[]; var data2 = {"code":"1","roleName":"大哥"} var data1 = {"code":"2","roleName":"二哥"} dataAry.push(data1); dataAry.push(data2); $.ajax({ url:'/coreRole/json2List.do', data:JSON.stringify(dataAry), type:'POST', dataType:'json', contentType: "application/json;charset=UTF-8", success:function(data){ alert(JSON.stringify(data)); }, error:function(){ alert('error'); } }); })
测试结果:
【json2List测试】role = [{"code":"2","roleName":"二哥"}, {"code":"1","roleName":"大哥"}]
(2016年5月13日14:16:46添加)高能预警:
虽然测试结果看到彷佛是正确的,可是,当咱们使用这个List的时候(好比循环),会抛出异常,说这个List对象的元素是一个JSONObject对象,不能转换成目标对象。当时就纳闷了,这彻底就是一个BUG。
那么,既然这个List的元素是JSONObject,那这个List对象就是一个JSONArray对象,toString()以后就是一个JSONArray的字符串,解决方案冒出水面了,咱们再使用fastjson的json字符串转对象,不是就搞定了么?返回参数就是咱们但愿获得的List对象了
JSON.parseArray(text, clazz)