下面是“springmvc学习笔记-返回json的日期格式问题的解决方法”的完整攻略:
Spring MVC 返回JSON的日期格式问题的解决方法
Spring MVC框架中,我们通常会使用JSON作为数据返回格式,但是在返回JSON数据的时候,日期格式往往会出现一些问题,本文将详细介绍如何解决Spring MVC返回JSON的日期格式问题。
问题描述
在Spring MVC中,我们使用的JSON返回格式常常是yyyy-MM-dd HH:mm:ss
格式的日期数据,而前端在解析JSON数据的时候,常常只识别JavaScript日期对象格式,即new Date()
对象,如下所示:
{
"id": 1,
"name": "张三",
"birthday": "2021-01-01 12:00:00"
}
在前端解析JSON数据时,可能无法对birthday
字段进行正确的解析,导致数据无法正常显示。所以我们需要将后台返回的日期数据转换成JavaScript日期对象格式,才能在前端正确地解析和显示数据。
解决方法
使用Jackson库自定义日期格式
在Spring框架中,我们通常使用Jackson库来将Java对象转换成JSON格式的字符串,并返回给前端。在Jackson库中,我们可以通过自定义日期格式,将Java对象中的日期类型转换成前端可识别的JavaScript日期对象格式。具体做法如下:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.text.SimpleDateFormat;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 序列化时统一日期格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
objectMapper.setDateFormat(dateFormat);
// Long类型转String类型,防止js丢失精度
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
return objectMapper;
}
}
在上面的代码中,我们首先通过new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
创建日期格式化对象,将日期格式设置为yyyy-MM-dd HH:mm:ss
,然后将日期格式设置到ObjectMapper
对象中。接着,我们通过SimpleModule
对象,将Long类型转换成String类型,防止js丢失精度。最后将SimpleModule
对象注册到ObjectMapper
中。
我们需要在Spring MVC的配置文件中,配置上述JacksonConfig
类的bean,这样Spring就会将自定义的日期格式和Long类型转换规则应用到JSON的转换中。
使用SpringMVC国际化
除了使用自定义日期格式外,我们还可以使用SpringMVC提供的国际化组件,将后台的日期数据转换成前端可识别的JavaScript日期对象格式。具体做法如下:
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
@Configuration
public class DateFormatConfiguration {
private final RequestMappingHandlerAdapter requestMappingHandlerAdapter;
public DateFormatConfiguration(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
this.requestMappingHandlerAdapter = requestMappingHandlerAdapter;
}
@PostConstruct
public void init() {
List<MappingJackson2HttpMessageConverter> converters = requestMappingHandlerAdapter.getMessageConverters()
.stream()
.filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
.map(converter -> (MappingJackson2HttpMessageConverter) converter)
.collect(Collectors.toList());
if (!converters.isEmpty()) {
List<Locale> locales = Locale.LanguageRange.parse(StringUtils.trimAllWhitespace("zh-CN"));
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json();
builder.serializers(new CustomDateSerializer(dateFormat, locales));
converters.forEach(converter -> {
builder.configure(converter.getObjectMapper());
});
}
}
private static class CustomDateSerializer extends JsonSerializer<Date> {
private final DateFormat dateFormat;
private final List<Locale> locales;
private CustomDateSerializer(DateFormat dateFormat, List<Locale> locales) {
this.dateFormat = dateFormat;
this.locales = locales;
}
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
gen.writeString(value.toInstant()
.atZone(ZoneId.systemDefault())
.format(DateTimeFormatter.ofPattern(dateFormat.toPattern(), locales.get(0))));
}
@Override
public Class<Date> handledType() {
return Date.class;
}
}
}
在上述代码中,我们使用了SpringMVC的请求处理适配器RequestMappingHandlerAdapter
来获取所有的JSON转换器MappingJackson2HttpMessageConverter
,然后对每个转换器设置自定义的日期格式。
我们需要在Spring MVC的配置文件中,配置上述DateFormatConfiguration
类的bean,这样Spring就会将自定义的日期格式应用到所有的JSON转换中。
示例说明
下面是两个具体的示例,展示如何在Spring MVC中使用自定义日期格式和SpringMVC国际化,将后台的日期数据转换成前端可识别的JavaScript日期对象格式。
示例1:使用自定义日期格式
在Java Controller中,我们可以通过注解@ResponseBody
将Java对象转换成JSON格式的字符串,并返回给前端。如下所示:
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
@ResponseBody
public User getUser(@PathVariable Long id) {
User user = new User();
user.setId(id);
user.setName("张三");
user.setBirthday(new Date());
return user;
}
}
在上面的例子中,我们将User
对象中的birthday
字段设置为了当前日期对象,后台会使用自定义的日期格式将日期对象转换成字符串形式的日期数据,如下所示:
{
"id": 1,
"name": "张三",
"birthday": "2021-01-01 12:00:00"
}
前端使用new Date(jsonData.birthday)
方法,将字符串形式的日期数据转换成日期对象。
示例2:使用SpringMVC国际化
在Java Controller中,我们可以通过注解@ResponseBody
将Java对象转换成JSON格式的字符串,并返回给前端。如下所示:
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
@ResponseBody
public User getUser(@PathVariable Long id) {
User user = new User();
user.setId(id);
user.setName("张三");
user.setBirthday(new Date());
return user;
}
}
在上面的例子中,我们将User
对象中的birthday
字段设置为了当前日期对象,后台会使用SpringMVC国际化组件将日期对象转换成前端可识别的JavaScript日期对象格式,如下所示:
{
"id": 1,
"name": "张三",
"birthday": "Fri Jan 01 2021 12:00:00 GMT+0800 (中国标准时间)"
}
前端使用new Date(jsonData.birthday)
方法,将字符串形式的日期数据转换成日期对象。
结语
本文详细介绍了SpringMVC返回JSON格式数据中日期格式问题的解决方法,包括使用Jackson库自定义日期格式和使用SpringMVC国际化组件,使后台的日期数据转换成前端可识别的JavaScript日期对象格式。希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc学习笔记-返回json的日期格式问题的解决方法 - Python技术站