后台快速开发框架搭建记录(2)——JSON处理相关
一、SpringBoot中返回JSON
User实体:
package com.tianqicode.myquickframe.modules.sys.entity;
import lombok.Data;
import java.util.Date;
/**
* @author wangtianqi
* @create 2020-09-17 13:48
*/
@Data
public class User {
private Long userId;
private String username;
private String password;
private Date createTime;
public User(Long userId, String username, String password, Date createTime) {
this.userId = userId;
this.username = username;
this.password = password;
this.createTime = createTime;
}
public User() {
}
}
controller:
package com.tianqicode.myquickframe.modules.sys.controller;
import com.tianqicode.myquickframe.modules.sys.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author wangtianqi
* @create 2020-09-17 13:50
*/
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/list")
public List<User> list() {
List<User> userList = new ArrayList<>();
Date today = new Date();
for (int i = 0; i < 5; i++) {
Long id = i + 0l;
userList.add(new User(id, "张" + i, "123456" + i, today));
}
return userList;
}
}
不需要更多的配置,现在只需要启动项目,在浏览器发出请求。就可以在页面看到json格式的数据。
[{"userId":0,"username":"张0","password":"1234560","createTime":"2020-09-17T06:06:46.538+00:00"},
{"userId":1,"username":"张1","password":"1234561","createTime":"2020-09-17T06:06:46.538+00:00"},
{"userId":2,"username":"张2","password":"1234562","createTime":"2020-09-17T06:06:46.538+00:00"},
{"userId":3,"username":"张3","password":"1234563","createTime":"2020-09-17T06:06:46.538+00:00"},
{"userId":4,"username":"张4","password":"1234564","createTime":"2020-09-17T06:06:46.538+00:00"}]
如果需要对日起进行格式化,仅需在配置文件中做如下配置。
server:
port: 8765
servlet:
context-path: /
spring:
jackson:
# 时间格式化
date-format: yyyy-MM-dd HH:mm:ss
# 设置时区
time-zone: GMT+8
没错,SpringBoot就是这么方便,前提是你使用Jackson或是Gson。springboot对Jackson或是Gson做了自动配置。数据并不是自然而然的变为了json格式,springboot帮我们做了这些工作。还是那句话:知其然,知其所以然。简单了解一下springboot都干了些什么。
二、HttpMessageConverter
2.1、是什么
HttpMessageConverter是一个消息转换工具,有两方面的功能:
- 将服务端返回的对象序列化成 JSON 字符串
- 将前端传来的 JSON 字符串反序列化成 Java 对象
所有的 JSON 生成都离不开相关的 HttpMessageConverter
2.2、Springboot中的HttpMessageConverter
打开全局搜索HttpMessageConverter
找到这个类JacksonHttpMessageConvertersConfiguration
并打开它,这个类就是Springboot对Jackson的自动配置类。
找到这个方法mappingJackson2HttpMessageConverter
,看名字就知道它有什么用了。它为我们自动配置了Jackson。
注意看@ConditionalOnMissingBean
这个注解下声明:如果容器中没有这两个类型的bean,那么就用springboot提供的方法。
同时看@ConditionalOnProperty
这个注释,意味着同样可以在配置文件中配置jackson。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ObjectMapper.class)
@ConditionalOnBean(ObjectMapper.class)
@ConditionalOnProperty(name = HttpMessageConvertersAutoConfiguration.PREFERRED_MAPPER_PROPERTY,
havingValue = "jackson", matchIfMissing = true)
static class MappingJackson2HttpMessageConverterConfiguration {
@Bean
// 注意这个注解,如果你没有提供一个MappingJackson2HttpMessageConverter类型的bean,
// 那么就使用这个自动配置类
@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class,
ignoredType = {
"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter",
"org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter" })
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
return new MappingJackson2HttpMessageConverter(objectMapper);
}
}
如果我们提供了这个bean呢?
package com.tianqicode.myquickframe.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.text.SimpleDateFormat;
/**
* @author wangtianqi
* @create 2020-09-17 14:30
*/
@Configuration
public class WebConfig {
@Bean
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper om = new ObjectMapper();
// 设置自己的日期格式
om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
converter.setObjectMapper(om);
return converter;
}
}
重启项目,再次请求之前路径,发现时间变为了我们自己配置的格式。
[{"userId":0,"username":"张0","password":"1234560","createTime":"2020/09/17 14:33:57"},
{"userId":1,"username":"张1","password":"1234561","createTime":"2020/09/17 14:33:57"},
{"userId":2,"username":"张2","password":"1234562","createTime":"2020/09/17 14:33:57"},
{"userId":3,"username":"张3","password":"1234563","createTime":"2020/09/17 14:33:57"},
{"userId":4,"username":"张4","password":"1234564","createTime":"2020/09/17 14:33:57"}]
这就是Springboot所说的:约定大于配置。 如果你有,用你的,这个项目可以正常工作。如果你没有,那么就用我的,这个项目依然可以正常工作。
以上对于Gson同理。全局搜索HttpMessageConverters
,可以找到GsonHttpMessageConvertersConfiguration
。打开源码,跟Jackson是一样的道理。
三、总结
如果在Springboot项目中使用Jackson或Gson,不需要额外配置只需要添加依赖即可。同时也可以使用配置文件或配置类对其进行配置。
另外:如果配置文件与配置类同时配置同一个参数,那么会优先以配置类为准。