【问题标题】:OffsetDateTime object should not be converted to json object [duplicate]OffsetDateTime 对象不应转换为 json 对象 [重复]
【发布时间】:2021-06-21 04:42:25
【问题描述】:

我正在将 java 对象转换为 json 对象。但是 OffsetDatetime 也被转换为 json 格式。是否可以将时间对象保留为 OffsetDatetime 时间戳本身。

Java 对象

{
  "start_date": "2022-01-01T13:45:00+01:00",
  "origin": {
    "type": "AIRPORT",
    "search_display_name": "Malmo, Sweden (MMX-Sturup)",
    "search_string": "MMX",
    "city": "Malmo"
  }
}

转成json后得到如下

{
  "start_date": {
    "offset": {
      "total_seconds": 0,
      "id": "Z",
      "rules": {
        "fixed_offset": true,
        "transition_rules": [
          
        ],
        "transitions": [
          
        ]
      }
    },
    "day_of_month": 1,
    "day_of_week": "SATURDAY",
    "day_of_year": 1,
    "month": "JANUARY",
    "month_value": 1,
    "year": 2022,
    "hour": 12,
    "minute": 45,
    "nano": 0,
    "second": 0
  },
  "origin": {
    "search_display_name": "Malmo, Sweden (MMX-Sturup)",
    "search_string": "MMX",
    "city": "Malmo"
  }
}

是否可以像这样“2022-01-01T13:45:00+01:00”保持offsetDateTime

Java 对象将使用此方法转换为 json objectMapper.valueToTree(response) 对象映射器配置如下

@Bean("objectMapperJavaTime")
public ObjectMapper objectMapperJavaTime() {
    return JacksonObjectMapperFactory.createMapperWithDefaultConfigurations()
             .registerModule(new JavaTimeModule())
             .enable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
}


public class JacksonObjectMapperFactory {

    public static ObjectMapper createMapperWithDefaultConfigurations(){
          return new Jackson2ObjectMapperBuilder()
                          .featuresToDisable(WRITE_DATES_AS_TIMESTAMPS)
                            .failOnUnknownProperties(false)
                            .serializationInclusion(NON_NULL)
                            .propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
                            .modules(new JodaModule())
                            .build();
    }
    
}

【问题讨论】:

  • 是的,这很容易实现,但是如何将对象转换为 JSON?请编辑问题以显示您的相关代码。它可能就像重写函数一样简单,只返回一个字符串而不是整个序列化对象。
  • @sorfiend 感谢您的调查。我已经编辑了问题
  • @sorfiend 尝试禁用此功能 WRITE_DATES_AS_TIMESTAMPS。但它仍然无法正常工作。
  • 最初没有拾取 bean。禁用此功能后现已解决。谢谢@sorifiend

标签: java spring-boot jackson


【解决方案1】:

在创建时尝试禁用WRITE_DATES_AS_TIMESTAMPS 功能通常会出现问题。

所以解决方案不是在创建时应用功能,所以删除这个:

.featuresToDisable(WRITE_DATES_AS_TIMESTAMPS)....

您可以在创建 ObjectMapper 后将其分解并设置为 false,而不是设置 feature 并在一行上返回 objectMapper:

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);`

然后返回objectMapper。

【讨论】:

  • 我尝试在对象映射器上添加 WRITE_DATES_AS_TIMESTAMPS 功能。但它没有用。我仍然没有将日期设为“start_date”:“2022-01-01T13:45:00+01:00”。 @Bean("objectMapperJavaTime") public ObjectMapper objectMapperJavaTime() { return EgenciaJacksonObjectMapperFactory.createMapperWithDefaultConfigurations().registerModule(new JavaTimeModule()) .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) .disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE) }
  • 我已经在 objectMapperJavaTime() 中覆盖了这个特性 WRITE_DATES_AS_TIMESTAMPS 因为 JacksonObjectMapperFactory 这个类是一个库,它不属于我们的团队
猜你喜欢
  • 2013-07-26
  • 2015-01-02
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2017-10-17
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多