Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách map nhiều định dạng ngày (date formats) dùng Jackson trong Java

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.