在 JAX-RS 2.1 中,用來在 JSON 與 Java 物件之間進行序列化及解除序列化的內部程式庫已從 Jackson 變更為 Yasson。Yasson 是 JSON-B 的參照實作。Jackson 及 Yasson 會以不同方式序列化時間相關的物件,例如:
| Jackson | Yasson | |
|---|---|---|
| java.util.Date | 726213720000 | 1993-02-05T06:02:00Z[UTC] |
| java.util.Calendar | 726213720000 | 1993-02-05T00:00:00-06:00[America/Chicago] |
產生或耗用 JSON 類型資料的任何 JAX-RS 資源方法皆會受影響。此規則會標示 JAX-RS 資源方法所產生或耗用的物件中包含的任何 java.util.Date 或 java.util.Calendar 欄位。
以下是產生及耗用包含 java.util.Date 及 java.util.Calendar 欄位的 Java 物件之 JAX-RS 資源方法範例:
|
@Path("/")
@ApplicationScoped public class MyService { @GET @Path("/get") @Produces(MediaType.APPLICATION_JSON) public DataObject getData() { //... } @GET @Path("/set") @Consumes(MediaType.APPLICATION_JSON) public void setData(DataObject data) { //... } } |
|
import java.util.Calendar;
import java.util.Date; public class DataObject { public Date juDate; public Calendar juCalendar; } |
此規則會標示 DataObject 物件中的 java.util.Date 及 java.util.Calendar 欄位。原始檔掃描器提供了此規則的快速修正程式。快速修正程式會將 @JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS) 新增至將輸出轉換為新紀元毫秒的欄位。執行快速修正程式之後,DataObject 類別將會變更為:
|
import java.util.Calendar;
import java.util.Date; import javax.json.bind.annotation.JsonbDateFormat; public class DataObject { @JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS) public Date juDate; @JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS) public Calendar juCalendar; } |
附註:若要存取快速修正程式新增的 @javax.json.bind.annotation.JsonbDateFormat 註釋,您需要將 jsonb 特性新增至 Liberty server.xml 配置檔。例如,如果您是使用 jaxrs-2.1 特性,請新增 jsonb-1.0 特性。
如需 Jackson 與 Yasson 之間行為差異的相關詳細資料,請參閱比較 Jackson 與 JSON-B 行為的是否要符合 JSON 連結標準?文章。