- 一、自定义Serializer和Deserializer
- 二、使用Mix-in Annotations
- 三、使用注解
- 四、使用ObjectMapper
- 五、使用BeanSerializerModifier
- 六、使用案例:枚举、字典数据的自动转化
- 6.1 实现思路
- 6.2 代码实现
一、自定义Serializer和Deserializer
当需要对特定的类或属性进行自定义的序列化和反序列化控制时,可编写自定义的序列化器(Serializer)和反序列化器(Deserializer)。通过实现 JsonSerializer 和 JsonDeserializer 接口,可以完全控制序列化和反序列化过程中的行为,包括如何读取属性、生成 JSON 或者解析 JSON 等。
使用自定义序列化器和反序列化器来控制日期格式的序列化和反序列化:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CustomDateSerializationExample {
public static class DateSerializer extends JsonSerializer<Date> {
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
String formattedDate = DATE_FORMAT.format(value);
gen.writeString(formattedDate);
}
}
public static class DateDeserializer extends JsonDeserializer<Date> {
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String dateString = p.getText();
try {
return DATE_FORMAT.parse(dateString);
} catch (Exception e) {
throw new IOException("Failed to parse date: " + dateString, e);
}
}
}
public static class Person {
private String name;
private Date birthDate;
// 省略构造和getter/setter方法
}
public static void main(String[] args) throws Exception {
SimpleModule module = new SimpleModule();
module.addSerializer(Date.class, new DateSerializer());
module.addDeserializer(Date.class, new DateDeserializer());
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
// 序列化
Person person = new Person("John Doe", new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01"));
String json = objectMapper.writeValueAsString(person);
System.out.println(json);
// 输出:{"name":"John Doe","birthDate":"2000-01-01"}
// 反序列化
String jsonInput = "{\"name\":\"Jane Smith\",\"birthDate\":\"1990-12-31\"}";
Person deserializedPerson = objectMapper.readValue(jsonInput, Person.class);
System.out.println(deserializedPerson.getBirthDate());
// 输出:Sat Dec 31 00:00:00 GMT 1990
}
}
二、使用Mix-in Annotations
Mix-in Annotations 允许在不修改原始类的情况下,为其添加自定义的序列化和反序列化逻辑。可以创建一个独立的 Mix-in 类,并在该类中为原始类添加自定义的注解,然后将 Mix-in 类与原始类关联起来。
用 Mix-in Annotations 来控制日期格式的序列化和反序列化:
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CustomDateSerializationExample {
public static class Person {
private String name;
@JsonSerialize(using = DateSerializer.class)
@JsonDeserialize(using = DateDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthDate;
// 省略构造函数和getter/setter方法
}
public static class DateSerializer extends JsonSerializer<Date> {
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
@Override
public void serialize(Date value, JsonGenerator gen, com.fasterxml.jackson.databind.SerializerProvider serializers) throws IOException {
String formattedDate = DATE_FORMAT.format(value);
gen.writeString(formattedDate);
}
}