必須轉換日期及行事曆類型的 JSON 連結

在 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.Datejava.util.Calendar 欄位。

以下是產生及耗用包含 java.util.Datejava.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;
}

此規則標記 java.util.Datejava.util.Calendar 欄位在 DataObject 物件中的 和欄位。 對於此規則,將提供自動修正以加入註釋 @JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS ) 到這些欄位,以將輸出轉換為年代 milliseconds.After 自動修正已套用, DataObject class 將更新如下:

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 連結標準?文章。