格式化是指序列化或反序列化时,将属性的值或键值转换为特定的格式。
常见的场景有:日期,货币,枚举,集合
特殊字符:NULL,空字符串,存在转义字符的值。
1、@JsonFormat
1.1 日期
在属性上添加@JsonFormat注解, shape指定类型,pattern指定日期格式,timezone指定时区,通常只需要pattern即可
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/shanghai") private Date birthDate;
1.2 枚举
在枚举类上添加@JsonFormat注解,User对象的Sex属性无需修改。shape指定生成的json字符串结构
@JsonFormat(shape = JsonFormat.Shape.NUMBER) @Getter public enum Sex { MALE("男"), FEMALE("女"); private String name; Sex(String name) { this.name = name; } }
当shape值为NUMBER时,为枚举的顺序,MALE为1,FEMALE为2。json串为{“sex”:1}
当shape值为String时,为枚举的名称。json串为{“sex”:”MALE”}
当shape值为Object时,json串为{“fieldProp”:{“enumProp”:”enumVal”}},例如:
"sex" : { "name" : "男" },
此时sex为User的枚举属性名称, name为枚举类Sex的属性名称,”男”为MALE的name属性值。
2、@JsonRawValue
当属性存在特殊的字符时,序列化时会添加转义字符,在属性上添加@JsonRawValue可以防止转义。
// 个性签名 @JsonRawValue private String slogan;
3、null
当属性值为NULL时,在属性或其set方法上添加@JsonSetter注解,设置nulls属性。
它的值有以下几种:
SET,TODO
AS_EMPTY生成空字符串
SKIP跳过,即忽略该属性
FAIL整个序列化过程会失败
DEFAULT默认情况,即会转换为null
@JsonSetter(nulls = Nulls.AS_EMPTY) private String name;
4、转换器
转换器适用于任何数据类型。实现步骤如下:
第一步,编写自定义XXConverter,继承StdDateConveter,它有两个泛型参数,第一个指Source,第二个指Destination,例如日期,第一个参数为Date,第二个参数为String。
public class DateToString extends StdConverter<Date, String> { private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); @Override public String convert(Date date) { return format.format(date); } }
第二步,在属性上添加@JsonSerialize(序列化)或@JsonDeSerialize(反序列化)注解。
第三步,设置converter属性为自定义的XXConverter。
@JsonSerialize(converter = DateToStringConverter.class) @JsonDeserialize(converter = StringToDate.class) private Date birthDate