如何在杰克逊序列化中自定义日期,@JsonSerialize 不起作用
Posted
技术标签:
【中文标题】如何在杰克逊序列化中自定义日期,@JsonSerialize 不起作用【英文标题】:how to customize Date in jackson serialization , @JsonSerialize not working 【发布时间】:2019-10-11 06:54:14 【问题描述】:我想更改由 java rest webservice 提供的 json 中的日期格式,这是因为 json 具有这样的日期:2019-05-23T06:00:00Z[UTC] em> ,因此客户端将 [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>
如果所有模型对象的日期序列化在一个位置,是否有任何方法可以更改格式?我宁愿这样,而不是为每个模型对象创建自定义序列化程序,在此先感谢
【问题讨论】:
是的,我试过了,但没用 【参考方案1】:我发现了我的问题,我需要将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>
【讨论】:
我被这件事逼疯了,这对我有用。我现在意识到 Glassfish 默认使用另一个提供程序。谢谢!【参考方案2】:我通常使用@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;
【讨论】:
我试过了,但没用,仍然显示 [UTC] 格式,......对不起,我在 jackson 中有点新,也许我遗漏了一些东西,应该在哪里 AppObjectMapper 类是什么?在某些特定的包或文件夹中? ,以上是关于如何在杰克逊序列化中自定义日期,@JsonSerialize 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用 matplotlib 在时间序列中自定义日期范围(x 轴)