Spring mvc Json处理实现流程代码实例

接收JSON

浏览器传来的参数,可以是 key/value 形式的,也可以是一个 JSON 字符串。在 Jsp/Servlet 中,我们接收 key/value 形式的参数,一般是通过 getParameter 方法。如果客户端商户传的是 JSON 数据,我们可以通过如下格式进行解析:

@RequestMapping("/addbook2")
@ResponseBody
public void addBook2(HttpServletRequest req) throws IOException {
  ObjectMapper om = new ObjectMapper();
  Book book = om.readValue(req.getInputStream(), Book.class);
  System.out.println(book);
}

但是这种解析方式有点麻烦,在 SpringMVC 中,我们可以通过一个注解来快速的将一个 JSON 字符串转为一个对象:

@RequestMapping("/addbook3")
@ResponseBody
public void addBook3(@RequestBody Book book) {
  System.out.println(book);
}

这样就可以直接收到前端传来的 JSON 字符串了。这也是 HttpMessageConverter 提供的第二个功能。

返回JSON

目前主流的 JON 处理工具主要有三种:

jackson

jackson 是一个使用比较多,时间也比较长的 JSON 处理工具,在 SpringMVC 中使用 jackson ,只需要添加 jackson 的依赖即可:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.10.1</version>
</dependency>

依赖添加成功后,凡是在接口中直接返回的对象,集合等等,都会自动转为 JSON。如下:

public class Book {
  private Integer id;
  private String name;
  private String author;
...
}

@RequestMapping("/book")
@ResponseBody
public Book getBookById() {
  Book book = new Book();
  book.setId(1);
  book.setName("三国演义");
  book.setAuthor("罗贯中");
  return book;
}

这里返回一个对象,但是在前端接收到的则是一个 JSON 字符串,这个对象会通过 HttpMessageConverter 自动转为 JSON 字符串。

如果想返回一个 JSON 数组,写法如下:

@RequestMapping("/books")
@ResponseBody
public List<Book> getAllBooks() {
  List<Book> list = new ArrayList<Book>();
  for (int i = 0; i < 10; i++) {
    Book book = new Book();
    book.setId(i);
    book.setName("三国演义:" + i);
    book.setAuthor("罗贯中:" + i);
    list.add(book);
  }
  return list;
}

converter 【肯喔特】转变器

添加了 jackson ,就能够自动返回 JSON,这个依赖于一个名为 HttpMessageConverter 的类,这本身是一个接口,从名字上就可以看出,它的作用是 Http 消息转换器,既然是消息转换器,它提供了两方面的功能:

将返回的对象转为 JSON

将前端提交上来的 JSON 转为对象

但是,HttpMessageConverter 只是一个接口,由各个 JSON 工具提供相应的实现,在 jackson 中,实现的名字叫做 MappingJackson2HttpMessageConverter,而这个东西的初始化,则由 SpringMVC 来完成。除非自己有一些自定义配置的需求,否则一般来说不需要自己提供

MappingJackson2HttpMessageConverter。

举一个简单的应用场景,例如每一本书,都有一个出版日期,修改 Book 类如下:

public class Book {
  private Integer id;
  private String name;
  private String author;
  private Date publish;
...
}

然后在构造 Book 时添加日期属性:

@RequestMapping("/book")
@ResponseBody
public Book getBookById() {
  Book book = new Book();
  book.setId(1);
  book.setName("三国演义");
  book.setAuthor("罗贯中");
  book.setPublish(new Date());
  return book;
}

访问 /book 接口,返回的 json 格式如下:

如果我们想自己定制返回日期的格式,简单的办法,可以通过添加注解来实现:

public class Book {
  private Integer id;
  private String name;
  private String author;
  @JsonFormat(pattern = "yyyy-MM-dd",timezone = "Asia/Shanghai")
  private Date publish;

注意这里一定要设置时区。

这样,就可以定制返回的日期格式了。

但是,这种方式有一个弊端,这个注解可以加在属性上,也可以加在类上,也就说,最大可以作用到一个类中的所有日期属性上。如果项目中有很多实体类都需要做日期格式化,使用这种方式就比较麻烦了,这个时候,我们可以自己提供一个 jackson 的 HttpMesageConverter 实例,在这个实例中,自己去配置相关属性,这里的配置将是一个全局配置。

在 SpringMVC 配置文件中,添加如下配置:

<mvc:annotation-driven>
  <mvc:message-converters>
    <ref bean="httpMessageConverter"/>
  </mvc:message-converters>
</mvc:annotation-driven>

<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" id="httpMessageConverter">
  <property name="objectMapper">
    <bean class="com.fasterxml.jackson.databind.ObjectMapper">
      <property name="dateFormat">
        <bean class="java.text.SimpleDateFormat">
          <constructor-arg name="pattern" value="yyyy-MM-dd HH:mm:ss"/>
        </bean>
      </property>
      <property name="timeZone" value="Asia/Shanghai"/>
    </bean>
  </property>
</bean>

添加完成后,去掉 Book 实体类中日期格式化的注解,再进行测试,结果如下:

gson

gson 是 Google 推出的一个 JSON 解析器,主要在 Android 开发中使用较多,不过,Web 开发中也是支持这个的,而且 SpringMVC 还针对 Gson 提供了相关的自动化配置,以致我们在项目中只要添加 gson 依赖,就可以直接使用 gson 来做 JSON 解析了。

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.6</version>
</dependency>

如果项目中,同时存在 jackson 和gson 的话,那么默认使用的是 jackson,为什么呢?在
org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter类的构造方法中,加载顺序就是先加载 jackson 的 HttpMessageConverter,后加载 gson 的 HttpMessageConverter。

加完依赖之后,就可以直接返回 JSON 字符串了。使用 Gson 时,如果想做自定义配置,则需要自定义 HttpMessageConverter。

<mvc:annotation-driven>
  <mvc:message-converters>
    <ref bean="httpMessageConverter"/>
  </mvc:message-converters>
</mvc:annotation-driven>
<bean class="org.springframework.http.converter.json.GsonHttpMessageConverter" id="httpMessageConverter">
  <property name="gson">
    <bean class="com.google.gson.Gson" factory-bean="gsonBuilder" factory-method="create"/>
  </property>
</bean>
<bean class="com.google.gson.GsonBuilder" id="gsonBuilder">
  <property name="dateFormat" value="yyyy-MM-dd"/>
</bean>

fastjson 号称最快的 JSON 解析器,但是也是这三个中 BUG 最多的一个。在 SpringMVC 并没针对 fastjson 提供相应的 HttpMessageConverter,所以,fastjson 在使用时,一定要自己手动配置 HttpMessageConverter(前面两个如果没有特殊需要,直接添加依赖就可以了)。

使用 fastjson,我们首先添加 fastjson 依赖:

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.60</version>
</dependency>

然后在 SpringMVC 的配置文件中配置 HttpMessageConverter:

<mvc:annotation-driven>
  <mvc:message-converters>
    <ref bean="httpMessageConverter"/>
  </mvc:message-converters>
</mvc:annotation-driven>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" id="httpMessageConverter">
  <property name="fastJsonConfig">
    <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
      <property name="dateFormat" value="yyyy-MM-dd"/>
    </bean>
  </property>
</bean>

fastjson 默认中文乱码,添加如下配置解决:

<mvc:annotation-driven>
  <mvc:message-converters>
    <ref bean="httpMessageConverter"/>
  </mvc:message-converters>
</mvc:annotation-driven>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" id="httpMessageConverter">
  <property name="fastJsonConfig">
    <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
      <property name="dateFormat" value="yyyy-MM-dd"/>
    </bean>
  </property>
  <property name="supportedMediaTypes">
    <list>
      <value>application/json;charset=utf-8</value>
    </list>
  </property>
</bean>

在 SpringMVC 中,对 jackson 和 gson 都提供了相应的支持,就是如果使用这两个作为 JSON 转换器,只需要添加对应的依赖就可以了,返回的对象和返回的集合、Map 等都会自动转为 JSON,但是,如果使用 fastjson,除了添加相应的依赖之外,还需要自己手动配置 HttpMessageConverter 转换器。其实前两个也是使用 HttpMessageConverter 转换器,但是是 SpringMVC 自动提供的,SpringMVC 没有给 fastjson 提供相应的转换器。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Springmvc 4.x利用@ResponseBody返回Json数据的方法

    下面是官方文档对于@ResponseBody注解的解释: Mapping the response body with the @ResponseBody annotation The @ResponseBody annotation is similar to @RequestBody. This annotation can be put on a method and indicates that the return type should be written straight to

  • SpringMVC接收与响应json数据的几种方式

    前言 前后端的数据交互,除了通过form表单进行提交外,也可以通过ajax向后端传递和接收json格式数据(这种方式可以实现请求数据和页面分离).本文将总结一下在Spring MVC中接收和响应json数据的几种方式. 话不多说了,来一起看看详细的介绍吧 准备步骤: 1.导入json相关框架的依赖(比如jackson). 2.spring mvc的controller方法正常写,如果需要响应json,增加@responsebody注解. 3.在接受json对应的输入参数前,加上@RequestB

  • SpringMvc后台接收json数据中文乱码问题详解

    原因分析 使用ajax从前台页面传输数据到后台controller控制器的时候,出现中文乱码 其实乱码问题出现的原因,就是由于默认的tomcat配置,接收请求是以ISO-8859-1来转码,导致中文出现了乱码问题,只要能正确的以utf-8来转码,则可以解决乱码问题. 普通数据传输,从jsp页面传到后台controller,中文乱码问题解决方案 首先检查jsp页面编码格式是否是utf-8 设置中文过滤 <filter> <filter-name>characterEncodingFi

  • springmvc接收json串,转换为实体类List方法

    开始我用List<泛型>接受json串,如下,结果list内并非泛型对象,而是JSONObject对象.这样在遍历的时候就报了转化异常的错误.我不知道为什么springmvc在处理这个的时候并没有将json对象转化为泛型对象(我认为应该能获取到,可能是配置问题或者使用不当导致的),这个错误用实际证明了java是假泛型. 如何解决呢,暂时有两种方案,第一种是使用json工具类转化json对象为泛型对象,第二种使用数组接受,然后将数组转化为list对象.代码如下下.如果哪天找到了更好的解决方案,或

  • springMvc 前端用json的方式向后台传递对象数组方法

    如下所示: JSP var vipFee= new Array; //遍历选中的对象 $("#feeList :checkbox:checked").each(function(i){ vipFee.push({"enterpriseSeq":$(this).attr("enterpriseSeq"),"merchNo":$(this).val(),"serviceFee":$(this).attr(&qu

  • SpringMvc直接接收json数据自动转化为Map的实例

    springMvc直接接收json数据自动转化为Map ,必须加上@RequestBody注解并且前台ajax发送请求的时候需要对数据进行格式化 $.ajax({ type : "POST", url : "/search", data :JSON.stringify(searchData), contentType:"application/json", dataType : "json", success : functi

  • Spring mvc JSON数据交换格式原理解析

    什么是JSON JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编程语言的文本格式来存储和表示数据. 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率. 在 JavaScript 语言中,一切都是对象.因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串.数字.对象.数组等.看看他的要求和

  • 浅谈springMVC接收前端json数据的总结

    对于json对象类型(即JsonObject)的数据,springMVC主要有以下几种方式接收: 1.通过Map接收 @RequestMapping(value = "/getAllStudio" ) public void getAllStudio(@RequestBody Map<String, Integer> map ) { JSONObject json = new JSONObject(); Integer page = map.get("page&q

  • postman+json+springmvc测试批量添加实例

    postman工具配置和数据准备: 1)在地址栏输入测试IP地址和端口号已经对应的接口地址: 2)在Headers一栏添加参数Content-Type=application/json; 已本地测试为例:对应配置图如下: 3)点击Body一栏,并选择raw,然后在对应的text区域输入要传递和添加的数据集合: 本例已两条数据位例,如下图: 其中每一条数据对象对应后台接口要保存的一条数据库记录,一个java对象: 到此,postMan的配置完成,只要点击send按钮触发发送事件即可已发送json格

  • Spring mvc Json处理实现流程代码实例

    接收JSON 浏览器传来的参数,可以是 key/value 形式的,也可以是一个 JSON 字符串.在 Jsp/Servlet 中,我们接收 key/value 形式的参数,一般是通过 getParameter 方法.如果客户端商户传的是 JSON 数据,我们可以通过如下格式进行解析: @RequestMapping("/addbook2") @ResponseBody public void addBook2(HttpServletRequest req) throws IOExce

  • Spring mvc文件上传下载代码实例

    简介 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作.如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver. 前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data.只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给

  • Spring MVC+FastJson+Swagger集成的完整实例教程

    基础部分 1. FastJson 简介 Fastjson是一个Java库,可用于将Java对象转换为JSON表示.它也可以被用来将一个JSON字符串转换成一个等效的Java对象.在转换速度上应该是最快的,几乎成为了项目的标配(在ajax请求和接口开发时一般都会用fastjson而不再使用jackson). GitHub: https://github.com/alibaba/fastjson (本地下载) 特性: 在服务器端和android客户端提供最佳性能 提供简单toJSONString()

  • Spring MVC+FastJson+hibernate-validator整合的完整实例教程

    一:hibernate-validator 基础 1. 简介: 通过使用注解Annotations 给类或者类的属性加上约束(constraint),在运行期检查属性值的合法性. 2. 作用: 在API接口开发中参数校验是非常重要的事情,因为客户端很可能会少传参数,或者值不合法,甚至参数值是恶意的,所以对客户端传来的参数的合法性就必须要校验了,其中将参数值的校验规则通过注解的形式注解到属性上是一种比较优雅的方式. 3. 常用的约束注解 @Null 被注释的元素必须为 null @NotNull

  • 聊聊Spring MVC JSON数据交互的问题

    我们在开发中后端经常需要接受来自于前端传递的Json字符串数据,怎么把Json字符串转换为Java对象呢?后端也经常需要给前端返回Json字符串,怎么把Java对象数据转换为Json字符串返回呢? 回顾JSON JSON(JavaScript Object Notation) 各个JSON技术比较 早期 JSON 的组装和解析都是通过手动编写代码来实现的,这种方式效率不高,所以后来有许多的关于组装和解析 JSON 格式信息的工具类出现,如 json-lib.Jackson.Gson 和 Fast

  • Spring MVC下 bootStrap服务器分页代码

    因为Spring 对于ajax直接返回对象,到了WEB页面就转换成json 所以不需要使用JSON转换封装可以直接使用 <span style="white-space:pre"> </span>@RequestMapping(value = "/searchList.cqzk") @ResponseBody public BootPage<IllegalParkInfo> search(BootPage<IllegalPa

  • Spring MVC中自定义拦截器的实例讲解

    1. 引言 拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter. 我们可以让普通的Bean实现HandlerIntercpetor接口或继承HandlerInterceptorAdapter类来实现自定义拦截器. 通过重写WebMvcConfigurerAdapter的addIntercetors方法来注册一个计算每一次请求的处理时间的拦截器. 2. 自定义拦截器的实现 2.1 定义拦截器 新建LogInterceptor类,并继承Ha

  • Spring MVC Mybatis多数据源的使用实例解析

    项目需要从其他网站获取数据,因为是临时加的需求,在开始项目时没想到需要多数据源 于是百度了一下,发现只需要改动一下Spring 的applicationContext.xml文件和编写三个工具类就可以完美实现 applicationContext.xml <!-- 多数据源配置 --> <bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource"> <property na

  • Python文件操作基本流程代码实例

    文件操作之基本流程 #文本 近日,上市药企--浙江莎普爱思药业股份有限公司频遭质疑. 12月2日,一篇名为<一年卖出7.5亿的洗脑"神药",请放过中国老人>的文章称, 多位眼科医生并不认可莎普爱思滴眼液的"白内障防治功效".质疑者认为, 莎普爱思滴眼液是"假科普,真营销",通过广告误导患者. 针对质疑,莎普爱思3日晚发布的公告称, 0.5%苄达 赖氨酸滴眼液已于上世纪90年代通过了临床试验, 是一种安全的.有效的抗白内障药物.假的 #

  • json字符串对象转换代码实例

    这篇文章主要介绍了json字符串对象转换代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.将字符串转为json对象:JSON.parse(); 2.json对象转字符串:JSON.stringify(); <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>创建json字符串对象</title

随机推荐