Spring MVC 4.x + fastjson 1.2.7,封裝的List參數

使用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)
相關文章
相關標籤/搜索