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