@JsonSerialize
1. 针对属性
@JsonSerialize 注解可指定自定义序列化器来序列化实体,可以配置在实体类、Getter 方法或属性字段上:
@Getter@Setterpublic 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);}@Overridepublic 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);}@Overridepublic 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@Setterpublic 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);}@Overridepublic 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);}@Overridepublic 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);// 注册模块到ObjectMapperMAPPER.registerModule(module);
