如何在杰克逊序列化中自定义日期,@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 轴)

杰克逊 - 序列化日期对象

2038 年问题仍然发生在 Java 8 中日期反序列化的杰克逊身上 [重复]

为日期反序列化设置杰克逊时区

如何删除杰克逊自定义序列化程序生成的空值?

如何在 vuetify 中自定义日期选择器?