SpringBoot 注解@JsonIgnoreProperties

1,783 阅读3分钟

*起因:今天阅读公司源码,看到实体类中的一个注解。

//公司源码
@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.实体类中,基本属性和快照属性的概念。