文档章节

SpringMvc中json转换

yope
 yope
发布于 2015/02/26 18:35
字数 594
阅读 92
收藏 0
点赞 0
评论 2

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


© 著作权归作者所有

共有 人打赏支持
yope
粉丝 15
博文 38
码字总数 33640
作品 0
厦门
程序员
加载中

评论(2)

yope
yope

引用来自“ulyn”的评论

不管是fastjson还是其他json,都应该遵循文章说的这句话:“直接使用注解的方式"@ResponseBody"自动将返回值转化成json格式”。所以fastjson的例子中,返回的自己转换的json串是不是就多余了??

这个后期也觉得有点画蛇添足的样子,因为偏离了使用fastjson的初衷
ulyn
ulyn
不管是fastjson还是其他json,都应该遵循文章说的这句话:“直接使用注解的方式"@ResponseBody"自动将返回值转化成json格式”。所以fastjson的例子中,返回的自己转换的json串是不是就多余了??
spring MVC中传递的参数对象中包含list的情况!!!!!

测试需要的jar包:spring 3.2.jar + jackson-all-1.8.5.jar。 写代码时碰到个需要将对象里的子明细一起传递到controller里去,当时就想直接将参数一起传递过来,贴下代码: controller: @Req...

yunlielai ⋅ 06/10 ⋅ 0

Spring集成redis(Spring Data Redis)

转载地址:http://blog.csdn.net/zhu_tianwei/article/details/44923001 Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(...

Mr_zebra ⋅ 06/06 ⋅ 0

Springmvc中@ResponseBody和@RequestBody的使用

springmvc中通过使用jackson配置来处理springmvc对json的支持,通过@ResponseBody来将后台对象转成json对象传给调用者,通过@RequestBody来将调用者传过来的json字符串转换为后台使用的对象具...

CsOH913 ⋅ 2016/01/17 ⋅ 0

AJAX与spring mvc交互

(1)简单交互: <table style="width: 100%" class="table" cellspacing="1" cellpadding="1" border="0"> <tr><td class="ti1" colSpan="2">请选择审讯室</td></tr> <tr><td class="ti2hu......

executor ⋅ 2014/08/28 ⋅ 0

SpringMVC用responsebody标签返回json的时候Error406

springmvc的好处就是可以用一个responsebody的标签直接将一个返回的对象转换成json 首先,需要配置spring,将以下的bean配置到spring的配置文件中 <bean class="org.springframework.web.ser...

王小明123 ⋅ 2016/02/03 ⋅ 0

SpringMVC整合JSON、XML视图

原创不易,转载请注明出处:SpringMVC整合JSON、XML视图 代码下载地址:http://www.zuidaima.com/share/1751862737554432.htm SpringMVC中整合了JSON、XML的视图,可以通过这些视图完成Java对...

最代码 ⋅ 2014/04/16 ⋅ 0

解决java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.ArrayList的问题

一、背景   最近闲来无事,想自己搭建一套Spring+SpringMVC+Mybatis+Mysql的环境(搭建步骤会在以后博客中给出),结果运行程序时,适用@ResponseBody注解进行返回List的json数据时出现了:...

hafiz.zhang ⋅ 2016/08/27 ⋅ 0

Spring MVC返回json字符串时数据格式化

在运用Spring MVC框架开发时,可以直接在方法上添加注解 @ResponseBody 返回JSON数据,如果javabean的属性中包含Date日期类型的数据,默认的转换格式并不是我们想要的 yyyy-MM-dd 这样的格式...

云颖 ⋅ 2014/01/22 ⋅ 0

Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

一、单元测试的目的   简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作。以减少我们在...

文文1 ⋅ 06/01 ⋅ 0

Spring中formdata方式提交json对象和file之一

问题 想使用vue-resource表单提交方式到spring,这个表单中包含json对象和file对象。 思路 将json对象和file对象都放到表单提交方式里面的中,并在中指定内容格式。 步骤 Spring实现和配置 ...

亚林瓜子 ⋅ 06/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 12分钟前 ⋅ 0

Java学习路径及练手项目合集

Java学习路径及练手项目合集

颖伙虫 ⋅ 27分钟前 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 53分钟前 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

MVC——统一报文格式的异常处理响应

在我们写controller层的时候,常常会有这样的困惑,如果需要返回一个数据是,可能为了统一回去构造一个类似下列的数据格式: { status:true, msg:"保存成功!", data:[]} 而且在写...

alexzhu592 ⋅ 昨天 ⋅ 0

android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。 如果手机本身...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部