方案一:使用阿里巴巴fastjson
1、pom.xml中添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.27</version>
</dependency>
2、viewspace-servlet.xml
<bean id="jsonConverter" class="com.sunsharing.springdemo.utils.MappingFastJsonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
<property name="serializerFeature" >
<list>
<value>WriteMapNullValue</value>
<value>QuoteFieldNames</value>
</list>
</property>
</bean>
<bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
</bean>
在整个过程中花了比较多的时间解决中文乱码,最后发现在
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
这个bean重复配置,导致编码没有被重置成utf-8,值得自己深深的反思.
另一方面,Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter使用了org.springframework.进行处理,里面的源码默认使用的是“ISO-8859-1”,org.springframework.中的getDefaultContentType方法是可以重写的,所以下面的工具类MappingFastJsonHttpMessageConverter 中 DEFAULT_CHARSET 改成utf-8后重写即可。
3、Controller层关键代码
@RequestMapping(value = "/jsondata")
@ResponseBody
public String getGonganList( HttpServletResponse response){
// response.setContentType("application/json; charset=utf-8");
List<Gongandanwei> gongandanwei=gongandanweiService.getAllGongandanwei();
String jsonString = JSON.toJSONString(gongandanwei);
System.out.println(jsonString);
return jsonString;
}
4、jsp页面
<script type="text/javascript" >
$(document).ready(function(){$.ajax({
url: "<%=context%>/jsondata.html",
type : "POST",
success: function(data){
console.info(JSON.stringify(data));
alert(data); },
dataType:"json"});
});
</script>
5、解决中文乱码的工具类
package com.sunsharing.springdemo.utils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
/**
* Created by nyp on 2015/2/13.
*/
public class MappingFastJsonHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
// fastjson特性参数
private SerializerFeature[] serializerFeature;
public SerializerFeature[] getSerializerFeature() {
return serializerFeature;
}
public void setSerializerFeature(SerializerFeature[] serializerFeature) {
this.serializerFeature = serializerFeature;
}
public MappingFastJsonHttpMessageConverter() {
super(new MediaType("application", "json", DEFAULT_CHARSET));
}
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
// JavaType javaType = getJavaType(clazz);
// return this.objectMapper.canDeserialize(javaType) &&
// canRead(mediaType);
return true;
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
// return this.objectMapper.canSerialize(clazz) && canWrite(mediaType);
return true;
}
@Override
protected boolean supports(Class<?> clazz) {
// should not be called, since we override canRead/Write instead
throw new UnsupportedOperationException();
}
@Override
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i;
while ((i = inputMessage.getBody().read()) != -1) {
baos.write(i);
}
return JSON.parseArray(baos.toString(), clazz);
}
@Override
protected void writeInternal(Object o, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
String jsonString = JSON.toJSONString(o, serializerFeature);
OutputStream out = outputMessage.getBody();
out.write(jsonString.getBytes(DEFAULT_CHARSET));
out.flush();
}
}
方案二:使用spring mvc自带的jackson
1、web工程lib中加入jackson所需jar包:jackson-core-asl-1.9.9.jar、jackson-mapper-asl-1.9.9.jar
2、在applicationContext.xml中加入jackson的配置
<!-- json转换器 -->
<bean id="jsonConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes" value="application/json" />
</bean>
3、在你的action中直接使用注解的方式"@ResponseBody"自动将返回值转化成json格式
@Controller
@RequestMapping("task")
public class TaskControl {
@RequestMapping("getUserById")
@ResponseBody
public List getUserById(Integer id) {
return this.taskService.getUserById(id);
}
}
4、jsp页面的js写法跟普通ajax格式一样
functon getUserById(id){
$.getJSON("task/getUserById",{id:id},function(data){
});
}
方案三:json-lib(待续)