java - Jackson 在 Spring Boot 中错误地序列化了 ZonedDateTime

标签 java json spring-boot jackson zoneddatetime

我有一个带有 Spring Boot 和 Jetty 的简单应用程序。我有一个简单的 Controller ,它返回一个具有 Java 8 ZonedDateTime 的对象:

public class Device {
  // ...
  private ZonedDateTime lastUpdated;

  public Device(String id, ZonedDateTime lastUpdated, int course, double latitude, double longitude) {
    // ...
    this.lastUpdated = lastUpdated;
    // ...
  }

  public ZonedDateTime getLastUpdated() {
    return lastUpdated;
  }
}

在我的 RestController 中,我只有:

@RequestMapping("/devices/")
public @ResponseBody List<Device> index() {
  List<Device> devices = new ArrayList<>();
  devices.add(new Device("321421521", ZonedDateTime.now(), 0, 39.89011333, 24.438176666));

  return devices;
}

我原以为 ZonedDateTime 会根据 ISO 格式进行格式化,但我却得到了该类的整个 JSON 转储,如下所示:

"lastUpdated":{"offset":{"totalSeconds":7200,"id":"+02:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"zone":{"id":"Europe/Berlin","rules":{"fixedOffset":false,"transitionRules":[{"month":"MARCH","timeDefinition":"UTC","standardOffset":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetBefore":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetAfter":{"totalSeconds":7200,"id":"+02:00", ...

我只有一个 spring-boot-starter-web 应用程序,使用 spring-boot-starter-jetty 并排除 spring-boot-starter-tomcat .

为什么 Jackson 在 Spring Boot 中会这样?

** 更新 **

对于那些寻找完整的分步指南如何解决这个问题的人,我在提出问题后发现了这一点: http://lewandowski.io/2016/02/formatting-java-time-with-spring-boot-using-json/

最佳答案

有一个图书馆jackson-datatype-jsr310 .试试看。

该库涵盖了新的日期时间 API,并且还包括 ZonedDateTime 的序列化程序。

你只需要添加 JavaTimeModule:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

更新

将日期时间转换为 ISO-8601您应该禁用的字符串 WRITE_DATES_AS_TIMESTAMPS特征。您可以通过覆盖 ObjectMapper bean 或使用 application properties 轻松完成:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

关于java - Jackson 在 Spring Boot 中错误地序列化了 ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39086472/

相关文章:

javascript - 如何在 Handlebars 中使用 json 和 nodeJs expressJs

java - 无法让 @Resource 注解在 Spring Boot 中工作

java - 为什么 repaint() 在此方法中不能正常工作

java - 当 java jvm 编译字节码时,该代码在进程空间中的什么位置?

json - 解码JSON数据时Type不符合Identifiable

javascript - 无法从 Coinhive API 的 AJAX 请求获取数据

java - Spring 启动: Best way to return 503 HttpStatus in ResponseEntity if the DataSource is DOWN

java - Spring中的POST方法不接受application/json

java - 如何在 JPanel 上覆盖、调整大小和居中组件?

java - 通过对 apply 进行相应的函数调用来反射(reflect)一组更改