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 配置文件中,添加如下配置:

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

扫一扫手机访问