基于@JsonSerialize和@JsonInclude注解使用方法

目录

  • @JsonSerialize和@JsonInclude注解
    • @JsonSerialize
    • 使用步骤
    • @JsonInclude
  • JSON @JsonSerialize 弃用问题解决方案

    @JsonSerialize和@JsonInclude注解
    @JsonSerialize
    后端开发时返回给前端的数据格式有时可能并不符合。
    举个例子,比如一张表中的时间,数据库中存储的是yyy-mm-dd hh:mm:ss 这样的形式,而前段需要的是精确到秒的格式,这是就会出现问题。此时可以利用@JsonSerialize注解,改变返回给前端的json格式
    @JsonSerialize注解,主要用于数据转换,该注解作用在该属性的getter()方法上。

    使用步骤
    1. 指定一个格式化的类
    里面写好规则
    //JsonSerializer:Integer为要转换的类型public class MySerializerUtils extends JsonSerializer {@Overridepublic void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {String statusStr = ""; switch (status) {case 0:statusStr = "暂存"; break; case 1:statusStr = "待上报"; break; case 2:statusStr = "待审核"; break; case 3:statusStr = "已审"; break; case 4:statusStr = "退回"; break; case -1:statusStr = "已删"; break; default:statusStr = "状态信息不符合"; }jsonGenerator.writeString(statusStr); }}


    //JsonSerializer:Date为要转换的类型public class Date2LongSerializer extends JsonSerializer {@Overridepublic void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {jsonGenerator.writeNumber(date.getTime() / 1000); }}

    2. 在实体类中在要转换的字段上加上该注解
    @JsonSerialize(using = MySerializerUtils.class)private int status;


    //创建时间@JsonSerialize(using = Date2LongSerializer.class)private Date creatTime; //更新时间@JsonSerialize(using = Date2LongSerializer.class)private Date updateTime;


    @JsonInclude
    返回前端的实体类中如果某个字段为空的话那么就不返回这个字段了
    所以将@JsonInclude(Include.NON_NULL) 这个注解放在类头上就可以解决。 实体类与json互转的时候属性值为 null 的不参与序列化
    JsonJsonInclude.Include.ALWAYS这个是默认策略,任何情况下都序列化该字段,和不写这个注解是一样的效果。
    @Data@JsonInclude(JsonInclude.Include.NON_NULL)public class OrderDTO {private String orderId; private String buyerName; private String buyerPhone; private String buyerAddress; private String buyerOpenid; List orderDetailList; //null,不返回}

    【基于@JsonSerialize和@JsonInclude注解使用方法】如果多个类都需要不返回null,挨个加注释太麻烦了,可以全局设置,更改配置文件application.yml
    spring:jackson:default-property-inclusion: non_null

    如果List orderDetailList; 需要返回一个空的list,但不能返回null,可以直接初始化
    List orderDetailList = new ArrayList<>();

    基于@JsonSerialize和@JsonInclude注解使用方法
    文章图片

    同样若要返回空字符而不是null,初始化
    private String msr = ""; private String data;

    基于@JsonSerialize和@JsonInclude注解使用方法
    文章图片


    JSON @JsonSerialize 弃用问题解决方案 @JsonSerialize弃用spring boot中,返回json默认是包含空串的,如果我们不想让json返回null值,可以在bean上添加一些注解。
    @JsonInclude(JsonInclude.Include.NON_EMPTY)??

    后面的枚举值可以为
    ALWAYS,NON_NULL, // 属性为NULL 不序列化,就是为null的字段不参加序列化NON_ABSENT, // 属性为默认值不序列化NON_EMPTY, // 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量NON_DEFAULT,CUSTOM,USE_DEFAULTS;

    调用
    @JsonInclude(JsonInclude.Include.NON_EMPTY)public class MsgBean {}

    Ps:好多资料上说的@JsonSerialize这个注解已经被弃用了~
    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

      推荐阅读