Jackson dùng annotation @JsonFormat để cấu hình serialize/deserialize date. Mỗi field có thể có một pattern. Để hỗ trợ nhiều format, dùng JsonDeserializer custom hoặc set multiple patterns qua ObjectMapper.
Cách 1: @JsonFormat trên field (1 pattern/field)
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
class Employee {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "IST")
private Date createDate; // Format: 1980-12-08
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z", timezone = "IST")
private Date createDateGmt; // Format: 1980-12-08 03:00 PM GMT+01:00
// getters/setters
}
Cách 2: Custom Deserializer hỗ trợ nhiều pattern (Deserialize linh hoạt)
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MultiFormatDateDeserializer extends StdDeserializer<Date> {
private static final String[] PATTERNS = {
"yyyy-MM-dd",
"yyyy-MM-dd HH:mm a z",
"dd/MM/yyyy",
"MM/dd/yyyy"
};
public MultiFormatDateDeserializer() { super(Date.class); }
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String dateStr = p.getText();
for (String pattern : PATTERNS) {
try {
return new SimpleDateFormat(pattern).parse(dateStr);
} catch (ParseException ignored) {}
}
throw new IOException("Cannot parse date: " + dateStr);
}
}
// Sử dụng:
class Event {
@JsonDeserialize(using = MultiFormatDateDeserializer.class)
private Date eventDate;
}
Cách 3: Cấu hình ObjectMapper global (Jackson 2.12+)
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); // Default
// Hoặc đăng ký multiple formats qua module
SimpleModule module = new SimpleModule();
module.addDeserializer(Date.class, new MultiFormatDateDeserializer());
mapper.registerModule(module);
Ví dụ hoàn chỉnh
public class JacksonMultiDateFormat {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String json = "{\"createDate\":\"1980-12-08\",\"createDateGmt\":\"1980-12-08 3:00 PM GMT+1:00\"}";
Employee emp = mapper.readValue(json, Employee.class);
System.out.println(emp);
}
}
Employee [createDate=Mon Dec 08 00:00:00 IST 1980, createDateGmt=Mon Dec 08 07:30:00 IST 1980]
Lưu ý: @JsonFormat chỉ hỗ trợ 1 pattern cho serialize. Deserialize đa format cần custom deserializer.