入参为date格式,用Object接收后放到JSONObject后,date格式变成了时间戳。如何解决这个问题
时间: 2025-03-18 21:13:47 浏览: 49
### 解决方案
在 Java 中,当将 `Date` 类型的对象放入 `JSONObject` 时,默认情况下可能会被转换为时间戳而不是日期字符串。这种行为可以通过配置 JSON 库的行为来避免。
#### 方法一:使用 Jackjson 配置自定义处理器
通过创建一个自定义的 `JsonConfig` 并注册一个处理 `Date` 类型的处理器,可以控制如何序列化 `Date` 对象[^2]。
以下是实现代码:
```java
import net.sf.json.JsonConfig;
import net.sf.json.JSONObject;
import net.sf.json.processors.JsonValueProcessor;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateToJsonExample {
public static void main(String[] args) {
JsonConfig jsonConfig = new JsonConfig();
// 注册自定义的 Date 处理器
jsonConfig.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
if (value instanceof Date) {
return dateFormat.format(value);
}
return null;
}
@Override
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return null;
}
});
// 创建包含 Date 的对象
MyData data = new MyData(new Date());
// 转换为 JSONObject
JSONObject jsonObject = JSONObject.fromObject(data, jsonConfig);
System.out.println(jsonObject.toString());
}
static class MyData {
private Date date;
public MyData(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
}
}
```
此方法适用于基于 Jackjson 的场景,能够确保 `Date` 字段以指定格式输出而非时间戳。
---
#### 方法二:使用 FastJSON 和注解方式
如果项目中使用的 JSON 库是 Alibaba 提供的 FastJSON,则可以直接利用其内置支持的注解功能[^3]。
以下是一个示例代码片段:
```java
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.JSONObject;
import java.util.Date;
public class FastJsonDateExample {
public static void main(String[] args) {
DataWithAnnotation data = new DataWithAnnotation();
// 设置当前时间为示例数据
data.setDate(new Date());
// 将对象转换为 JSON
String jsonString = JSONObject.toJSONString(data);
System.out.println(jsonString);
}
static class DataWithAnnotation {
@JSONField(format = "yyyy-MM-dd HH:mm:ss") // 自定义日期格式
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
}
```
在此方法中,通过 `@JSONField` 注解指定了日期字段的格式,从而避免了默认的时间戳形式。
---
#### 方法三:Spring Boot 环境下的全局配置
对于 Spring Boot 项目而言,可以在应用启动时设置全局的 Jackson 配置,使所有的 `Date` 输出都遵循特定格式。
具体做法如下:
1. 添加依赖项(如果是 Maven 项目):
```xml
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
```
2. 在 `application.properties` 或 `application.yml` 文件中添加配置:
```properties
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
```
或者,在代码层面完成相同的功能:
```java
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
return mapper;
}
}
```
这种方法适合于整个项目的统一管理需求。
---
### 总结
上述三种方法分别针对不同的开发环境提供了解决方案。其中,第一种方法适用于纯 Jackjson 场景;第二种方法则更适合 FastJSON 用户;而第三种方法则是 Spring Boot 开发者的首选策略。
阅读全文
相关推荐

















