当前位置: 首页 > 面试题库 >

Jersey + Jackson JSON日期格式序列化-如何更改格式或使用自定义JacksonJsonProvider

薛宏壮
2023-03-14
问题内容

我正在使用Jersey + Jackson为我的应用程序提供REST JSON服务层。我的问题是默认的日期序列化格式如下所示:

"CreationDate":1292236718456

起初我以为这是UNIX时间戳…但是太长了。我的客户端JS库在反序列化此格式时遇到了问题(它支持一堆不同的日期格式,但我认为不支持)。我想更改格式,以便可以由我的库使用(例如ISO)。我该怎么做…我发现了一段代码可能会有所帮助,但是…由于我不控制Jackson序列化程序实例化(Jersey这样做),我应该将其放在哪里?

objectMapper.configure(
    SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);

我也找到了用于自定义的代码JacksonJsonProvider-问题是..如何使我的所有POJO类都使用它?

@Provider
public class MessageBodyWriterJSON extends JacksonJsonProvider {

    private static final String DF = "yyyy-MM-dd’T'HH:mm:ss.SSSZ";

    @Override
    public boolean isWriteable(Class arg0, Type arg1, Annotation[] arg2,
            MediaType arg3) {
        return super.isWriteable(arg0, arg1, arg2,
                arg3);
    }
    @Override
    public void writeTo(Object target, Class arg1, Type arg2, Annotation[] arg3,
            MediaType arg4, MultivaluedMap arg5, OutputStream outputStream)
            throws IOException, WebApplicationException {
            SimpleDateFormat sdf=new SimpleDateFormat(DF);

        ObjectMapper om = new ObjectMapper();
        om.getDeserializationConfig().setDateFormat(sdf);
        om.getSerializationConfig().setDateFormat(sdf);
        try {
            om.writeValue(outputStream, target);
        } catch (JsonGenerationException e) {
            throw e;
        } catch (JsonMappingException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        }
    }
}

问题答案:

就其价值而言,该数字是标准Java时间戳(由JDK类使用);Unix存储秒(Java毫秒),这就是为什么它的值更大的原因。

我希望有一些有关如何将ObjectMapper注入Jersey的文档(应该遵循通常的方式注入提供的对象)。但是,您也可以重写JacksonJaxRsProvider来指定/配置ObjectMapper并进行注册;这是Jersey本身所做的,并且有多种方法可以实现。



 类似资料:
  • ObjectMapper不会将对象格式化为自定义对象。 波乔不在我的控制之下,所以我不能改变它。我需要序列化WS的POJO对象。POJO有(我不知道为什么,因为它的日期来自数据库)。 我使用的是Spring boot 2.1.8。释放,所以。。。我将其放入我的依赖项中: 我还在应用程序中添加了这个。特性: 在配置文件中,我在配置文件中添加了这个bean,因为尽快配置ObjectMapper以接受更

  • 我正在开发一个API,使用ASP公开一些数据。NET Web API。 在其中一个API中,客户端希望我们以格式公开日期。我不想为此更改全局设置(例如,),因为它非常特定于此客户端。我在为多个客户开发的解决方案中做到了这一点。 我能想到的一个解决方案是创建一个自定义的,然后将其放入我需要进行自定义格式化的属性中 例如。 只是想知道是否还有其他简单的方法。

  • 我正在尝试用自定义日期格式序列化和反序列化相当简单的对象: 在执行main方法时,我希望得到类似于: “日期”:“20151117” 20151117 但不幸的是得到了以下几点: {“日期”:“20151117”} 20151117-01-01T00:00:00.000+03:00(年份不正确) 似乎Jackson忽略了对象反序列化的@JSONFORMAT注释,并将字符串视为ISO-8601符号中

  • 我有一个包含日期列的表。 早些时候,我以“7 / 8 / 2012”格式插入了日期值。- m/d/yyyy 我想以“07/08/2014”的形式更改此格式。- 月/日/年 我的表中有大约3000个条目。如何将此日期值更改为新格式。我试图使用“alter”命令和set,但无法批量更改它。

  • 我正在研究spring-boot和gradle,以创建一个rest服务。现在我需要将json日期格式设置为“yyyy-MM-dd”,即格式应为dateOfBirth:“16-03-2015”,但我得到的是“dateOfBirth:-751181400000”。我在我的应用程序中添加了以下代码。java类,但仍然无法获得所需的输出。 和应用程序.java: 请帮我解决这个问题。

  • 如何使用threeten BP验证自定义格式的日期,如31/02/1985?