ObjectMapper转JSON时LocalDateTime字段未按指定格式输出问题
问题解决方案
问题根源
你使用的是Java 8引入的LocalDateTime时间类型,Jackson原生默认序列化规则仅支持旧版java.util.Date类,无法识别LocalDateTime的格式化配置,所以会出现你遇到的结构化对象输出问题,同时setDateFormat方法仅对java.util.Date生效,对LocalDateTime无效。
解决步骤
1. 引入Jackson JSR310时间处理模块
首先需要在项目中引入支持Java 8时间类型的Jackson模块:
- Maven项目在
pom.xml中添加依赖:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>和你项目中jackson核心版本一致即可</version> </dependency>
- Gradle项目添加依赖:
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:你的jackson版本号'
2. 修正ObjectMapper配置
修改你初始化ObjectMapper的代码,注册时间模块并禁用时间戳序列化:
ObjectMapper objectMapper = new ObjectMapper(); // 注册Java8时间处理模块 objectMapper.registerModule(new JavaTimeModule()); // 禁用时间类型序列化为时间戳/结构化对象 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 全局时间格式配置(如果字段上已加@JsonFormat注解,会优先使用字段配置) DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); objectMapper.setDateFormat(df); String jsonList = objectMapper.writeValueAsString(userList); System.out.println("userlog =>> " + jsonList);
3. 修正实体类注解错误
你当前在startDateTime、endDateTime的字段上添加了@JsonIgnore注解,该注解会导致Jackson序列化时直接忽略对应字段,即使get方法上有@JsonFormat注解也不会生效,需要删除字段上的@JsonIgnore注解。
修改完以上配置后,再次执行序列化即可输出你预期的格式化时间字符串。
内容的提问来源于stack exchange,提问作者Diptendu Das
相关产品推荐
相关产品推荐

