当前位置: 首页 > 知识库问答 >
问题:

使用JSON使用Spring Boot格式化Java时间[重复]

袁高峰
2023-03-14

我想在 Spring Boot v1.5.14.RELEASE 应用程序中实现一个自定义验证器。首先,我创建一个自定义约束注释:

我有这个对象:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@SuperBuilder
public class Hotel {

    @JsonFormat(pattern = "yyyy-MM-dd")
    private OffsetDateTime interactionDurationStart;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private OffsetDateTime interactionDurationEnd;

}

在 YML 中:

spring:
  jackson:
    mapper:
      DEFAULT_VIEW_INCLUSION: true
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false

在我的配置文件中:

@Primary
@Bean
public ObjectMapper objectMapper() {

    ObjectMapper objectMapper = new ObjectMapper();
    //objectMapper.registerModule(new JavaTimeModule());
    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addSerializer(OffsetDateTime.class, new JsonSerializer<OffsetDateTime>() {
        @Override
        public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
            jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(offsetDateTime));
        }
    });
    objectMapper.registerModule(simpleModule);

    return objectMapper;
}

但这是我在API响应中看到的

"interactionDurationEnd" : {
      "offset" : {
        "totalSeconds" : 7200,
        "id" : "+02:00",
        "rules" : {
          "transitionRules" : [ ],
          "transitions" : [ ],
          "fixedOffset" : true
        }
      },

共有3个答案

柳轶
2023-03-14

什么版本的杰克逊数据绑定?

尝试添加形状

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-mm-dd")

如果它起作用,那么您的问题是旧版本jackson bind存在一个bug,需要使用该形状,否则默认情况下,它将是任何形状。

慕阳
2023-03-14

发生这种情况是因为Spring使用的ObjectMapper默认只识别Date。如果您想使用offsetDateTime字段,请查看Spring Boot中offsetDateTime的Jackson日期格式,因为您需要注册序列化程序/反序列化程序才能为您完成这项工作。

如果您想将字段类型更改为日期,那么我不确定 JsonFormat 是否有效,因为我从未使用过它。我的解决方案是提供一个 ObjectMapper bean 来使用 objectMapper.setDateFormat(new SimpleDateFormat(“yyyy-MM-dd”))来启动,这可以解决问题。

希望有帮助!

郎鹤龄
2023-03-14

Spring MVC 使用 Jackson 作为默认的 json 对象映射器。默认情况下,Jackson 不支持 java8 的 Time API 的序列化/反序列化,但它提供了一个用于集成它的模块。只需在您的pom中包含此依赖项.xml

<dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
  </dependency>

Spring Boot 自动配置将检测 Jackson 模块类 JavaTimeModule 并将其添加到 ObjectMapper 实例中。

如果要手动创建 ObjectMapper 实例,则可以使用以下行添加模块:

objectMapper.registerModule(new JavaTimeModule());
 类似资料:
  • 问题内容: 有没有一种方法可以将UTC时间格式化为我想要的Java中任意字符串格式?基本上,我在考虑让某个类使用时间戳,然后传递它是字符串,告诉它如何格式化,然后它为我返回格式化的字符串。有没有办法做到这一点? 问题答案: java.text.SimpleDateFormat类以对语言环境敏感的方式提供日期的格式设置和解析。 SimpleDateFormat的javadoc标头是详细信息的很好来源

  • 问题内容: 我有一个带时间戳字段的mySQL数据库。我正在测试时,目前只有一个项目, 我从数据库中提取并使用 我的最终结果显示为 有人知道为什么吗? 编辑:editedit:忽略该编辑… notepad ++的FTP附加组件超时,很遗憾,当它无法同步时,它不会显示错误。 问题答案: 该函数希望将UNIX时间戳记作为其第二个参数- 这意味着您必须将从数据库获取的日期转换为UNIX时间戳记,可以使用以

  • 问题内容: 我正在创建我的JavaFX应用程序,每次创建新的列表单元格时都需要使用时间标签。我需要将当前时间的字符串格式直接放入作为参数的Label构造函数中。 我发现并使用了: 但是它显示了错误的时区,所以我将使用和分类。 有没有办法在一行中实现相同的字符串结果?谢谢您的帮助 :) 问题答案: 在新的应用程序中使用Java 8类型(java.time)可能更好。您可以先创建一个: 然后获取当前时

  • 问题内容: 我正在尝试使用这种格式来格式化当前时间。 输出: 有什么建议? 问题答案: 用 由于Go使用以下常量来格式化日期,请参阅此处

  • 问题内容: 我有一个JSON格式的以下文件: 之前: 使用以下代码处理数据后: 我将JSON保存到另一个文件中: 问题是,保存文件后,格式损坏了: 我的问题是-如何在PowerShell中保留源格式? 问题答案: 由于您的原始json包含一个只有一个元素的数组,因此PowerShell会将其压缩为仅一个元素。如果在输出中希望再次将其作为数组,请使用rokumaru的好答案。 但是,PowerShe

  • 我用Java定义了以下格式: 我的应用程序从日历中获取特定日期: 我想以的格式存储另外两个日期。给定的的和。 例如,如果是我想创建以下两个变量- 我该怎么做?