写在前面
JSON 是目前主流的前后端数据传输方式。在 Spring Boot 项目中,只要添加了 WEB依赖(spring-boot-starter-web),就可以很方便地实现 JSON 转换。WEB 依赖默认加入了 jackson-databind 作为 JSON 处理器,我们不需要要添加额外的 JSON 处理器就可以返回一段 JSON。
先看看下面两篇博文:
SpringBoot - @JsonFormat注解详解:https://blog.csdn.net/goodjava2007/article/details/126028371
SpringBoot - @JsonIgnore和@JsonIgnoreProperties注解详解以及区别:https://blog.csdn.net/goodjava2007/article/details/126655804
官方文档
JSON中文官网:http://www.json.org/json-zh.html
JSON官网:http://www.json.org
JACKSON-GITHUB官网地址:https://github.com/FasterXML/jackson
JACKSON-GITHUB文档地址:https://github.com/FasterXML/jackson-docs
版本说明
Jackson 的 1.x 版本的包名是 org.codehaus.jackson ,当升级到 2.x 版本时,包名变为 com.fasterxml.jackson,本文讨论的内容是基于最新的 Jackson 的 2.9.1 版本。
核心模块
Jackson 的核心模块由三部分组成:
- jackson-core,核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。
- jackson-annotations,注解包,提供标准注解功能;
- jackson-databind ,数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。
- jackson-databind 依赖 jackson-core 和 jackson-annotations,当添加 jackson-databind 之后, jackson-core 和 jackson-annotations 也随之添加到 Java 项目工程中。
如何在SPRINGBOOT中使用?
第一步:创建实体对象
第二步:针对实体对象的属性添加注解
@JsonIgnore: 序列化时将JAVA BEAN中的一些属性忽略掉,即生成JOSN时不生成其标注过的属性;
@JsonFormat:将日期类型的数据格式化成指定格式的字符串。
public class User {
private String userName;
@JsonIgnore
private String password;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date created;
}
第三步:控制层直接返回该实体对象
另:
我们经常使用的@RequestBody和@ResponseBody注解,他们的作用就是将报文反序列化/序列化POJO对象,SPRING默认使用Jackson来进行序列化和反序列化。(序列化,将JAVA对象转换成字节流的过程;反序列化,将字节流转换成JAVA对象的过程)
如何在非SPRINGBOOT框架的JAVA项目中使用?
依赖引入
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.4</version>
</dependency>
常用注解
JACKSON的常用注解:https://www.baeldung.com/jackson-annotations
注解 | 用法 |
---|---|
@JsonProperty | 属性注解,把属性的名称序列化时转换为另外一个名称,可以在序列化和反序列化中使用。 |
@JsonAlias | 属性注解,用于指定JAVA属性可以接受的更多名称,只在反序列化中使用。 |
@JsonIgnore | 属性注解,用于在序列化时忽略该属性。 |
@JsonIgnoreProperties | 类注解,用于在序列化时忽略一个或多个字段。@JsonIgnoreProperties({ “id”,“password” }) |
@JsonFormat | 属性注解,针对日期属性使用该注解进行格式化输出。 |
@JsonPropertyOrder | 类注解, 用于指定序列化后属性在JSON中的顺序。@JsonPropertyOrder({ “name”, “id” }) |
@JsonCreator | 在构造函数中添加@JsonCreator注解,配合@JsonProperty注解进行属性指向。 |
@JsonRootName | 类注解,需要先开启:objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 用于给当前序列化的实体对象加一层包裹对象,但不支持该 JSON 串反序列化。 |
时间格式化的三种方案,当然也可以进行其他的统一设置
A. 使用注解:
public class User {
private String userName;
@JsonIgnore
private String password;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date created;
}
B. 全局配置(application.yml):
spring:
jackson:
# 主要是针对日期字段的格式化
date-format: yyyy-MM-dd HH:mm:ss
# 也是针对日期字段的设置, 使用不同的时区, 最终日期类型字段响应的结果不一样
time-zone: Asia/Shanghai
C. 代码全局配置:
public class ApplicationConfig {
/**
* 时区配置
*/
@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
return jacksonObjectMapperBuilder ->
jacksonObjectMapperBuilder
// 设置日期的显示格式
.dateFormat(new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"))
// 设置时区
.timeZone(TimeZone.getDefault());
}
}