@JsonSerialize
1. 针对属性
@JsonSerialize 注解可指定自定义序列化器来序列化实体,可以配置在实体类、Getter 方法或属性字段上:
@Getter
@Setter
public static class User {
private String name;
@JsonSerialize(using = CustomDateSerializer.class)
private Date birthday;
}
我们显式对 User 实体的 birthday 属性进行自定义的序列化逻辑:
public class CustomDateSerializer extends StdSerializer<Date> {
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public CustomDateSerializer() {
this(null);
}
protected CustomDateSerializer(Class<Date> t) {
super(t);
}
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString(format.format(value));
}
}
对其进行序列化:
public static void main(String[] args) throws JsonProcessingException {
User user = new User();
user.setName("张三");
user.setBirthday(new Date());
System.out.println(MAPPER.writeValueAsString(user));
}
// 输出结果:{"name":"张三","birthday":"2021-09-10 11:13:33"}
2. 针对对象
如果想要对整个类进行自定义的序列化:
@Getter
@Setter
@JsonSerialize(using = CustomUserSerializer.class)
public static class User {
private String name;
private Date birthday;
}
自定义序列化器的逻辑为:
public class CustomUserSerializer extends StdSerializer<JsonSerializeTest.User> {
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public CustomUserSerializer() {
this(null);
}
protected CustomUserSerializer(Class<JsonSerializeTest.User> t) {
super(t);
}
@Override
public void serialize(JsonSerializeTest.User value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeStringField("name", value.getName() + "^^");
gen.writeStringField("birthday", format.format(value.getBirthday()) + "^^");
gen.writeEndObject();
}
}
// 输出结果:{"name":"张三^^","birthday":"2021-09-10 13:02:26^^"}
@JsonDeserialize
1. 针对属性
�@JsonDeserialize 注解用于自定义反序列化的逻辑:
@Getter
@Setter
public static class User {
private String name;
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date birthday;
}
自定义反序列化器:
public class CustomDateDeserializer extends StdDeserializer<Date> {
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public CustomDateDeserializer() {
this(null);
}
protected CustomDateDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
String date = p.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
对其进行反序列化:
public static void main(String[] args) throws JsonProcessingException {
User userD = MAPPER.readValue("{\"name\":\"张三\",\"birthday\":\"2021-09-10 11:13:33\"}", User.class);
System.out.println(userD.getBirthday());
}
// 输出结果:Fri Sep 10 11:13:33 CST 2021
// 如果不加自定义的反序列化器,Jackson 默认是无法识别这种日期格式的
2. 针对对象
如果想要对整个类进行自定义的反序列化:
@Getter
@Setter
@JsonDeserialize(using = CustomUserDeserializer.class)
public static class User {
private String name;
private Date birthday;
}
自定义反序列化器的逻辑为:
public class CustomUserDeserializer extends StdDeserializer<JsonDeserializeTest.User> {
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public CustomUserDeserializer() {
this(null);
}
protected CustomUserDeserializer(Class<?> vc) {
super(vc);
}
@Override
public JsonDeserializeTest.User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonDeserializeTest.User user = new JsonDeserializeTest.User();
ObjectCodec codec = p.getCodec();
JsonNode jsonNode = codec.readTree(p);
try {
String name = jsonNode.get("name").asText();
user.setName(name);
String birthday = jsonNode.get("birthday").asText();
user.setBirthday(format.parse(birthday));
return user;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
通过 Module 注册
通过注解声明的方式比较局限,此外,我们也可以通过 Jackson 提供的 Module 机制把自定义的序列化、反序列化器注册到 ObjectMapper 上:
CustomUserDeserializer userDeserializer = new CustomUserDeserializer();
// 创建一个模块,将自定义序列化、反序列化器注册到模块
SimpleModule module = new SimpleModule();
module.addDeserializer(JsonDeserializeTest.User.class, userDeserializer);
// 注册模块到ObjectMapper
MAPPER.registerModule(module);