*起因:今天阅读公司源码,看到实体类中的一个注解。
//公司源码
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(value = {"handler"}) //fixed mybatis懒加载序列化错误
//Serializable 序列化接口(以前ejb的东西,现在都直接用json做持久化)
public class OrgEntity implements Serializable {
//序列化的标识号
private static final long serialVersionUID = -7676998231354576158L;
private String id;
private String name;
//创建时间
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime;
@JsonIgnore
private String resource;
}
一、注解的作用
我们平时在返回中直接返回或在返回对象中使用的类,spring已经使用jackson帮我们自动转化为 to json。但有些自动转 json 的格式并不符合我们的要求,需要一个可以自定义json格式的方法。
二、jackson的maven依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.1</version>
</dependency>
三、@JsonProperty
1、作用
- 对属性重命名,如在Java对象中属性是驼峰规则书写,但在数据库中是以下划线的形式,此处映射时就可以使用该注解。
2、用法 例如:数据库中字段为:id,customer_id,customer_name
public class CustomerInfo{
private int id;
//使用@JsonProperty将表架构映射到实体类
@JsonProperty("customer_id")
private String customerId;
@JsonProperty("customer_name")
private String customerName;
}
四、@JsonIgnore
1、作用
- 用于属性或方法上(最好用于属性),用来完全忽略被注解的字段和方法对应的属性。即便这个字段可被自动检测或有其它注解,返回的json数据中也不包含被注解的字段或属性。
2、用法
使用情景:需要把一个List转换成json格式的数据传递给前台。但实体类中基本属性字段的值都存储在快照属性字段中。此时我可以在业务层中做处理,把快照属性字段的值赋给实体类中对应的基本属性字段。最后,我希望返回的json数据中不包含这两个快照字段,那么在实体类中快照属性上加注解@JsonIgnore,那么最后返回的json数据,将不会包含customerId和productId两个属性值。
public class CustomerInfo{
private int id;
//使用@JsonIgnore注解在生成json时,忽略该字段
@JsonIgnore
private String customerId;
@JsonIgnore
private String customerName;
}
五、@JsonIgnoreProperties
1、作用
- 类注解,作用是json序列化时将java bean中一些属性忽略掉,序列化和反序列化都受影响。
2、用法
@JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上后,就会忽略类中不存在的字段。或可以直接指定要忽略的字段。
@Data
@JsonIgnoreProperties(value = {"handler","comment"})
public class CustomerInfo{
private int id;
private String name;
private String handler;
private String comment;
private String mail;
@JsonIgnore
private String address;
private String reg;
}
说明:CustomerInfo类中,handler和comment字段被@JsonIgnoreProperties注解忽略掉;address字段被@JsonIgnore注解忽略。
最后返回的json数据中,将不包含这三个字段。
六、@JsonFormat
1、作用
- 把Date类型转换成我们想要的形式。
2、用法
//格式如:2023-1-28 10:33:26
@JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”)
private Date updateTime;
@JsonFormat(timezone = “Asia/Shanghai”, pattern = “yyyy-MM-dd HH:mm:ss”)
private Date updateTime;
七、@JsonSerialize
用于属性或者getter方法上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。
八、@JsonDeserialize
用于属性或者setter方法上,用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize。
九、@JsonInclude
属性值为null的不参与序列化。例子:@JsonInclude(Include.NON_NULL)。
十、未解决的问题
1.源码中的,mybatis 懒加载是什么?
2.实体类中,基本属性和快照属性的概念。