方案一:使用阿里巴巴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(待续)