如何在杰克逊序列化中自定义日期,@JsonSerialize 不起作用
how to customize Date in jackson serialization , @JsonSerialize not working
我想更改 json 中由 java rest 网络服务提供的日期格式,这是因为 json 的日期如下:2019-05-23T06:00:00Z[UTC] ,因此客户端将 [UTC] 与数组混淆,因为 '[' 和 ' ]'
我正在使用 glassfish 5、jax-rs、jackson 2.9.4 数据绑定,
.我尝试在模型对象中使用 @JsonSerialize(using = CustomXSerializer.class) 并且没有工作,还有 @JsonFormat(shape= JsonFormat.Shape.STRING , pattern="MM-dd-yyyy",timezone="CET") 在模型对象中的 Date 属性 但同样没有工作,它总是显示 [UTC]
我的代码:
package api;
import model.people;
import java.util.Date;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/helloworld")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class HelloWorldRest {
@GET
@Produces(MediaType.APPLICATION_JSON)
public people sayHello() {
people p=new people("pepe", "27",new Date());
return p;
}
}
模型对象:
public class people {
private String nombre;
private String edad;
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="MM-dd-yyyy",timezone="CET")
public Date d;
public people(String pNombre,String pEdad,Date pD)
{ nombre=pNombre;
edad=pEdad;
d=pD;
}
.
.
//getters and setters
pom:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
如果所有模型对象的日期序列化都集中在一个位置,是否有任何方法可以更改格式?我宁愿这样而不是为每个模型对象创建自定义序列化程序,提前致谢
我通常使用 @Provider
来自定义日期。
@Provider
public class AppObjectMapper implements ContextResolver<ObjectMapper> {
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
static {
// .. other configuration for Jackson Object Mapper.
MAPPER.setDateFormat(df);
}
public AppObjectMapper() {
}
@Override
public ObjectMapper getContext(Class<?> type) {
return MAPPER;
}
}
我发现我的问题是什么,我需要将 jackson 注册为 jersey 的 json 提供商,这样它就可以像这样在 web.xml 中注册
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
</init-param>
并像这样在 pom 中使用依赖项:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.x</version>
</dependency>
我想更改 json 中由 java rest 网络服务提供的日期格式,这是因为 json 的日期如下:2019-05-23T06:00:00Z[UTC] ,因此客户端将 [UTC] 与数组混淆,因为 '[' 和 ' ]'
我正在使用 glassfish 5、jax-rs、jackson 2.9.4 数据绑定, .我尝试在模型对象中使用 @JsonSerialize(using = CustomXSerializer.class) 并且没有工作,还有 @JsonFormat(shape= JsonFormat.Shape.STRING , pattern="MM-dd-yyyy",timezone="CET") 在模型对象中的 Date 属性 但同样没有工作,它总是显示 [UTC]
我的代码:
package api;
import model.people;
import java.util.Date;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/helloworld")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class HelloWorldRest {
@GET
@Produces(MediaType.APPLICATION_JSON)
public people sayHello() {
people p=new people("pepe", "27",new Date());
return p;
}
}
模型对象:
public class people {
private String nombre;
private String edad;
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="MM-dd-yyyy",timezone="CET")
public Date d;
public people(String pNombre,String pEdad,Date pD)
{ nombre=pNombre;
edad=pEdad;
d=pD;
}
.
.
//getters and setters
pom:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
如果所有模型对象的日期序列化都集中在一个位置,是否有任何方法可以更改格式?我宁愿这样而不是为每个模型对象创建自定义序列化程序,提前致谢
我通常使用 @Provider
来自定义日期。
@Provider
public class AppObjectMapper implements ContextResolver<ObjectMapper> {
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
static {
// .. other configuration for Jackson Object Mapper.
MAPPER.setDateFormat(df);
}
public AppObjectMapper() {
}
@Override
public ObjectMapper getContext(Class<?> type) {
return MAPPER;
}
}
我发现我的问题是什么,我需要将 jackson 注册为 jersey 的 json 提供商,这样它就可以像这样在 web.xml 中注册
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
</init-param>
并像这样在 pom 中使用依赖项:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.x</version>
</dependency>