springmvc学习笔记-返回json的日期格式问题的解决方法

下面是“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技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 用Java实现简单ATM机功能

    下面是用Java实现简单ATM机功能的完整攻略: 1. 需求分析 在实现ATM机功能前,我们首先需要对需求进行分析。 根据通常的ATM操作流程,我们可以将以下主要功能列出: 查询余额 取款 存款 转账 2. 设计思路 在完成需求分析后,我们需要进行设计思路。 我们需要为ATM机设计一个系统,包含以下实体: 用户 银行账号 ATM机 我们可以通过面向对象的方式…

    Java 2023年5月19日
    00
  • 用JavaScript实现 铁甲无敌奖门人 “开口中”猜数游戏

    下面是用JavaScript实现「铁甲无敌奖门人“开口中”猜数游戏」的完整攻略。 游戏规则 该游戏分为两个角色:猜数者和奖门人。在游戏开始时,奖门人会先随机设定一个数(一般为 1 到 100 之间的整数),并说出自己设定的数是在 1 到 100 之间。然后,猜数者可以轮流猜测这个数字,而奖门人将回答「大了」、「小了」或者「猜对了」。如果猜数者猜对了,游戏结束…

    Java 2023年6月15日
    00
  • JavaScript实现图片倒影效果 – reflex.js

    下面我将详细讲解“JavaScript实现图片倒影效果 – reflex.js”的完整攻略。 介绍 reflex.js是一个用于实现图片倒影效果的JavaScript插件。使用reflex.js,您可以很容易地在网页中添加图片倒影效果。 步骤 步骤一:加入源代码 要使用reflex.js,您需要将它的源代码(可以在GitHub上下载)加入到您的网页中。您可以…

    Java 2023年6月15日
    00
  • 举例讲解Java的Jackson库中ObjectMapper类的使用

    首先我们需要了解Jackson库是什么。Jackson是一个Java库,用于把 Java 对象序列化为基于文本,JSON或者XML的表现形式,并将相应的格式反序列化到 Java 对象中。它是用于处理 JSON 数据的最流行和最受欢迎的Java库之一。 ObjectMapper是Jackson中最为核心的类之一,它提供了一些序列化与反序列化的特性,以下是具体的…

    Java 2023年5月26日
    00
  • Java Spring Boot 集成Zookeeper

    Java Spring Boot 集成 Zookeeper 完整攻略 什么是 Zookeeper ZooKeeper 是一个分布式协调服务,能够在分布式系统中提供一致性,可靠性,易用性的功能,使得分布式应用的开发和维护变得更加容易。 ZooKeeper 作为独立的服务来运行,但常常与分布式应用程序一起使用,作为分布式应用程序的一部分运行。 集成 Zookee…

    Java 2023年5月19日
    00
  • Spring MVC文件请求处理MultipartResolver详解

    在 Spring MVC 中,MultipartResolver 是用于处理文件上传请求的组件。本文将详细讲解 Spring MVC 文件请求处理 MultipartResolver 的使用方法和注意事项。 MultipartResolver 的使用方法 在 Spring MVC 中,我们可以通过配置 MultipartResolver 来处理文件上传请求。…

    Java 2023年5月18日
    00
  • Java分布式锁由浅入深介绍

    Java分布式锁由浅入深介绍 什么是分布式锁 分布式锁是一种通过共享锁来保证分布式环境下多进程、多线程之间数据同步的技术。常用的锁算法有互斥锁、读写锁、乐观锁、悲观锁等。 基于Zookeeper的分布式锁 Zookeeper是一种分布式协同管理工具,提供了一种基于节点的会话机制,这种机制可以通过锁节点来控制多个进程的协调。Zookeeper主要有以下特点: …

    Java 2023年5月20日
    00
  • 类加载器委托机制是如何工作的?

    以下是关于类加载器委托机制的完整使用攻略: 类加载器委托机制是什么? 类加载器委托机制是Java虚拟机(JVM)用来加载类的一种机制。当一个类需要被加载时,JVM会先委托给当前类加载器进行加载,如果当前类加载器无法加载该类,则会将该请求委托给父类加载器进行加载。父类加载器也无法加载该类,则会继续向上委托,直到顶层的父类加载器为止。如果顶层的父类加载器仍然无法…

    Java 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部