@JsonSerialize
后端开发时返回给前端的数据格式有时可能并不符合。
举个例子,比如一张表中的时间,数据库中存储的是yyy-mm-dd hh:mm:ss 这样的形式,而前段需要的是精确到秒的格式,这是就会出现问题。此时可以利用@JsonSerialize注解,改变返回给前端的json格式
@JsonSerialize注解,主要用于数据转换,该注解作用在该属性的getter()
方法上。
使用步骤
1. 指定一个格式化的类
里面写好规则
//JsonSerializer<Integer>:Integer为要转换的类型
public class MySerializerUtils extends JsonSerializer<Integer> {
@Override
public 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>:Date为要转换的类型
public class Date2LongSerializer extends JsonSerializer<Date> {
@Override
public 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<OrderDetail> orderDetailList;//null,不返回
}
如果多个类都需要不返回null,挨个加注释太麻烦了,可以全局设置,更改配置文件application.yml
spring:
jackson:
default-property-inclusion: non_null
如果List<OrderDetail> orderDetailList;
需要返回一个空的list,但不能返回null,可以直接初始化
List<OrderDetail> orderDetailList = new ArrayList<>();
同样若要返回空字符而不是null,初始化
private String msr = "";
private String data;