Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธี Map Multiple Date Formats ด้วย Jackson ใน Java

ใช้ Annotation @JsonFormat ระบุ pattern ต่างกันต่อ Field ได้เลย Jackson จะ Parse ตาม Pattern ที่กำหนดในแต่ละ Field

Syntax @JsonFormat

@JsonFormat(
    shape = JsonFormat.Shape.STRING, // หรือ NUMBER (Timestamp)
    pattern = "yyyy-MM-dd",          // SimpleDateFormat Pattern
    timezone = "Asia/Bangkok"        // Timezone (Optional)
)

ตัวอย่างครบถ้วน: Field ต่างกัน Pattern ต่างกัน

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
import java.io.Serializable;

class Employee implements Serializable {
    // Pattern: Date Only (yyyy-MM-dd)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Bangkok")
    private Date hireDate;
    
    // Pattern: Date Time with Timezone (yyyy-MM-dd HH:mm a z)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z", timezone = "GMT")
    private Date lastLoginGmt;
    
    // Pattern: ISO-8601 (Default Jackson)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    private Date createdAt;
    
    // Getters/Setters
    public Date getHireDate() { return hireDate; }
    public void setHireDate(Date hireDate) { this.hireDate = hireDate; }
    public Date getLastLoginGmt() { return lastLoginGmt; }
    public void setLastLoginGmt(Date lastLoginGmt) { this.lastLoginGmt = lastLoginGmt; }
    public Date getCreatedAt() { return createdAt; }
    public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; }
}

public class JacksonMultiDateFormat {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT);
        
        // Deserialize: JSON มี Format ต่างกัน
        String json = """
            {
                "hireDate": "2023-01-15",
                "lastLoginGmt": "2023-12-01 02:30 PM GMT",
                "createdAt": "2023-06-15T10:30:45.123+07:00"
            }
            """;
        
        Employee emp = mapper.readValue(json, Employee.class);
        System.out.println("Deserialized:");
        System.out.println("Hire Date: " + emp.getHireDate());
        System.out.println("Last Login GMT: " + emp.getLastLoginGmt());
        System.out.println("Created At: " + emp.getCreatedAt());
        
        // Serialize: ใช้ Pattern เดิมที่กำหนด
        String output = mapper.writeValueAsString(emp);
        System.out.println("\nSerialized JSON:");
        System.out.println(output);
    }
}

ผลลัพธ์

Deserialized:
Hire Date: Sun Jan 15 00:00:00 ICT 2023
Last Login GMT: Fri Dec 01 14:30:00 GMT 2023
Created At: Thu Jun 15 10:30:45 ICT 2023

Serialized JSON:
{
  "hireDate" : "2023-01-15",
  "lastLoginGmt" : "2023-12-01 02:30 PM GMT",
  "createdAt" : "2023-06-15T10:30:45.123+07:00"
}

Pattern ตัวอย่างที่ใช้บ่อย

Pattern ตัวอย่าง คำอธิบาย
yyyy-MM-dd 2023-12-31 Date Only
yyyy-MM-dd HH:mm:ss 2023-12-31 23:59:59 Date Time 24h
yyyy-MM-dd HH:mm a z 2023-12-31 11:59 PM GMT Date Time 12h + Timezone
yyyy-MM-dd'T'HH:mm:ss.SSSXXX 2023-12-31T23:59:59.123+07:00 ISO-8601 with Millis & Offset
dd/MM/yyyy 31/12/2023 Thai/European Format

หมายเหตุ

  • Pattern ใช้ SimpleDateFormat Syntax (Java 8+ แนะนำ DateTimeFormatter แต่ Jackson ยังใช้ SimpleDateFormat Pattern)
  • timezone ใช้ได้ทั้ง Serialize/Deserialize ถ้าไม่ระบุใช้ System Default
  • Global Config: mapper.setDateFormat(new SimpleDateFormat("...")) แต่ @JsonFormat Override ได้ต่อ Field