在 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 之间的行为差异的更多详细信息,请参阅 Is it time for a JSON binding standard? 文章“比较 Jackson 和 JSON-B 行为”。