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

如何在MongoDb中使用杰克逊将日期字段存储为ISODate()

郦何平
2023-03-14
问题内容

我试图 java.util.Date 使用fasterxml
jackson在mongo集合中保留具有字段的java对象。问题是objectMapper的默认性质是将Date存储为NumberLong类型。

例如,类型 createdTime 字段 java.util.Date 将如下存储:

"createdTime" : NumberLong("1427728445176")

我想以mongo Shell中可用的 ISODate 格式存储它。

现在,我知道有一种格式化对象映射器的方法来将Date存储为String dateformat。但是我只在寻找ISODate()格式。

例如 "createdTime" : ISODate("2015-01-20T16:39:42.132Z")

有没有办法做到这一点 ?请告知大师。在此先感谢您的帮助。


问题答案:

您需要的是Jackson Joda模块。如果将其导入到类路径中,则可以在映射器上执行以下操作以将其写为所需的时间戳记:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
mapper.writeValueAsString(date);

您可以date根据需要在上面的代码示例中用POJO 替换。

编辑:看起来您真正想要的是自定义序列化程序。看起来像这样:

public class IsoDateSerializer extends JsonSerializer<DateTime> {
    @Override
    public void serialize(DateTime value, JsonGenerator jgen, SerializerProvider provider) {
        String isoDate = ISODateTimeFormat.dateTime().print(value);
        jgen.writeRaw("ISODATE(\"" + isoDate + "\")");
    }

然后,您将在所有日期时间类型的映射器上注册它

mapper.addSerializer(DateTime.class, new IsoDateSerializer());

或使用注释在函数上指定

@JsonSerializer(using = IsoDateSerializer.class)
public DateTime createdTime;


 类似资料:
  • Java Jackson能否将一个json字符串date反序列化成Java Long字段(从epoch开始的毫秒数)? 这是一个要反序列化的json字段的示例: 这是Java类中的同一字段,带有当前注释: 但是,发生异常: com . faster XML . Jackson . databind . exc . invalidformatexception:无法从字符串“2022-01-02T0

  • 问题内容: 我们将JSON序列化与Jackson结合使用,以公开系统的内部状态以调试属性。 默认情况下,杰克逊不会序列化瞬态字段-但我也希望对其进行序列化。如何序列化这些字段? 我知道的一种方法是为这些字段提供getter-但我不想这样做,因为我有一些我不想被调用的getX方法(例如,有些getter会更改对象状态)。 我知道我可以创建一个注释,但是我真的想避免使用它。 所以我的问题是:有没有一种

  • 我试图在Jackson的spring boot应用程序中从JSON获取日期字段。JSONFormat如下所示: 它在大多数情况下都能正常工作,但当我通过2017-0526时,它会自动将其转换为2018年5月10日。 如果日期不是yyyyMMdd格式或包含减号,我想引发异常。我试图查看堆栈溢出和Jackson文档,但找不到任何东西。 为什么JsonFormat接受负日期? 对此是否有任何解决方法,以

  • 问题内容: 我想将日期从Twitter反序列化为。我的程序在反序列化领域失败。 我的网域课程 我的解析方法 两项测试均失败,并出现java.time.ZonedDateTime 错误。 我已经检查了关于Stackoverflow的类似问题,我的格式看起来正确。 我做错了吗? 解决了 问题出在地区。添加确切的区域设置后,测试开始通过。 对于 用于测试 问题答案: 尝试在您的媒体资源上添加此注释

  • 我想将Twitter上的日期反序列化为。我的程序在<code>created_at</code>字段反序列化时失败。 我的域名类 我的解析方法 两个测试都失败,java.time.ZonedDateTime 类型的值。 我在Stackoverflow上检查了类似的问题,我的格式看起来是正确的。 我做错了? 解决 问题出在区域设置中。添加确切的区域设置后,测试开始通过。 对于<code>jackso

  • 问题内容: 我正在使用Jackson 将Java Bean转换为。 但是,它不是保留对象,而是将其转换为。 这是失败的测试用例, 有一个简单的解决方案吗? 问题答案: 默认情况下,Jackson将实例序列化为数字时间戳。您可以将Jackson配置为使用带有 或提供您自己的。 但是,当您进行转换时,中间JSON和目标类型中绝对没有任何内容可向Jackson表示应将其反序列化为对象。如果没有额外的类型