date 型および calendar 型の 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.Date フィールドまたは java.util.Calendar フィールドにフラグを立てます。

以下に、java.util.Date フィールドと java.util.Calendar フィールドを含む Java オブジェクトを作成および取り込む JAX-RS リソース・メソッドの例を示します。

< span class="Code"> @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) {
//...
}
}
< span class="Code"> < span class= "JavaKeyword"> import < /span> 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 クラスは次のように更新されます。 は以下のように更新されます:

< span class="Code"> < span class= "JavaKeyword"> import < /span> 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 の動作を比較した Is it time for a JSON binding standard? という記事を参照してください。