对后端返回的日期属性进行格式化(扩展 Spring MVC 的消息转换器)

news2024/11/26 19:42:36

格式化之前                                                  格式化之后:

解决方式

方式一

在属性中加上注解,对日期进行格式化

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

方式二

在WebMvcConfiguration 中扩展Spring MVC的消息转换器,统一对日期类型进行格式化处理

扩展 Spring MVC 的消息转换器

    /**
     * 扩展Spring MVC框架的消息转换器
     * @param converters
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //创建一个消息转换器对象
         MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
        converter.setObjectMapper(new JacksonObjectMapper());
        //将自己的消息转换器加入容器中(因为converters拥有自带的消息转换器,所以设置索引为0可以优先使用自己的消息转换器)
        converters.add(0,converter);
    }
  • extendMessageConverters 方法: 该方法允许开发者自定义 Spring MVC 的消息转换器。通过重写WebMvcConfigurationSupport中的这个方法,可以添加自定义的消息转换器。
  • @Override: 注解表示这个方法重写了父类中的同名方法,这里是WebMvcConfigurationSupportextendMessageConverters 方法。

  • protected void extendMessageConverters(List<HttpMessageConverter<?>> converters): 方法签名,接收一个 List 类型的参数,包含所有当前注册的消息转换器。

  • MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

    创建一个新的 MappingJackson2HttpMessageConverter 实例。这个转换器用于将 Java 对象转换为 JSON 格式(序列化),以及将 JSON 数据转换为 Java 对象(反序列化)。
  • converter.setObjectMapper(new JacksonObjectMapper());

    设置自定义的对象转换器(ObjectMapper)。JacksonObjectMapper 是一个自定义类,通常是 ObjectMapper 的一个扩展或配置版本。这样做的目的是让转换器使用特定的配置,例如序列化和反序列化的规则、日期格式等。
  • converters.add(0, converter);

    将自定义的消息转换器添加到转换器列表的第一个位置(索引为0)。这意味着在处理请求时,Spring 会优先使用这个自定义的转换器,而不是默认的转换器。确保你的自定义逻辑在系统的默认逻辑之前执行。

 自定义 ObjectMapper(JacksonObjectMapper)对象转换器

package com.sky.json;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}
  • JacksonObjectMapper: 这个类继承自 ObjectMapper,用于自定义 JSON 的序列化和反序列化规则。

  • 日期时间格式常量:

    • DEFAULT_DATE_FORMAT: 定义了默认日期格式(yyyy-MM-dd)。
    • DEFAULT_DATE_TIME_FORMAT: 定义了默认日期时间格式(yyyy-MM-dd HH:mm)。
    • DEFAULT_TIME_FORMAT: 定义了默认时间格式(HH:mm:ss)。
  • 构造函数:

    • this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false): 配置 Jackson,使其在遇到未知属性时不抛出异常。这有助于增强反序列化的灵活性。
    • this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES): 进一步确保在反序列化时忽略未知属性。
  • SimpleModule: 创建并注册一个模块,指定如何处理 Java 8 日期和时间 API 类型的序列化与反序列化。

    • 使用 addDeserializer() 方法,定义如何将 JSON 中的日期时间字段解析为 Java 对象。
    • 使用 addSerializer() 方法,定义如何将 Java 对象序列化为 JSON。
  • registerModule(simpleModule): 注册自定义的模块,使得 Jackson 能够使用定义的序列化和反序列化器。

CBOR详解

CBOR(Concise Binary Object Representation)是一种二进制数据格式,主要用于数据序列化和反序列化。它是为了提供一种比 JSON 更高效的方式来编码数据,以满足现代应用程序对性能和存储空间的需求。

CBOR 的特点

  1. 紧凑性:

    CBOR 使用二进制格式,通常比文本格式(如 JSON)占用更少的空间。这使得它在网络传输和存储时更加高效。
  2. 高效性:

    由于 CBOR 是二进制格式,解析速度通常比文本格式快,因为它避免了字符串解析所需的额外处理。
  3. 灵活的数据类型:

    CBOR 支持多种数据类型,包括:
    • 布尔值和空值
    • 映射(键值对)
    • 数组
    • 字符串(文本和二进制)
    • 浮点数
    • 整数(正整数和负整数)
  4. 与 JSON 兼容:

    CBOR 能够表示 JSON 所有的数据结构,这使得它在需要与 JSON 互操作时非常方便。
  5. 自描述性:

    CBOR 数据包含类型信息,接收方可以根据这些信息理解数据的结构,减少了解析时的复杂性。
  6. 扩展性:

    CBOR 允许用户定义扩展类型,可以根据特定的需求添加新的数据类型。

CBOR 的结构

CBOR 数据的基本构成是由一系列的标签、类型标识符和具体数据组成。每个数据项都有一个类型标识符,指示数据的类型。例如:

  • 整数: 0 到 23 用单字节表示,超过这个范围则使用多个字节。
  • 浮点数: 支持半精度和单精度浮点数。
  • 字符串: 可以是 UTF-8 编码的文本或二进制数据。
  • 数组和映射: 分别用于表示有序和无序的数据集合。

应用场景

  1. 物联网(IoT): 在带宽有限的环境中,CBOR 的紧凑性能够显著提高数据传输效率。

  2. 网络通信: 特别是在快速响应和低延迟的应用中,CBOR 提供了更好的性能。

  3. 存储系统: 适合用于大规模数据存储,因其占用空间小且读写效率高。

  4. API 和微服务: CBOR 可用于后端服务之间的数据交换,特别是在 JSON 交互频繁的场合。

总结

CBOR 是一种现代、高效的序列化格式,适用于各种需要高性能和低带宽的应用场景。通过其紧凑的二进制表示和灵活的数据结构,CBOR 为开发者提供了处理数据的新工具,尤其是在物联网、网络通信和存储系统等领域。

示例数据

假设我们有一个简单的字典对象,内容如下:

{
  "name": "Alice",
  "age": 30,
  "isStudent": false,
  "courses": ["Math", "Science"],
  "grades": {
    "Math": 90,
    "Science": 85
  }
}

转换为 CBOR

将上述 JSON 数据转换为 CBOR 格式后,它的二进制表示可能类似于以下内容(注意:实际的二进制数据会因实现而异,以下为示意):

A5 67 6E 61 6D 65 61 6C 69 63 18 1E 67 61 67 65 30 1E 69 73 53 74 75 64 65 6E 74 6E 65 02 81 04 67 43 6F 75 72 73 82 64 4D 61 74 68 64 39 6D 61 74 68 64 35 53 63 69 65 6E 63 65 38 35

这里的每一段数据代表了 JSON 中的不同部分,例如名称、年龄、课程等。

使用 CBOR 库

在实际编码和解码过程中,可以使用库来处理 CBOR 数据。在 Python 中,我们可以使用 cbor2 库来实现:

import cbor2

# 原始数据
data = {
    "name": "Alice",
    "age": 30,
    "isStudent": False,
    "courses": ["Math", "Science"],
    "grades": {
        "Math": 90,
        "Science": 85
    }
}

# 编码为 CBOR
cbor_data = cbor2.dumps(data)

# 解码回原始数据
decoded_data = cbor2.loads(cbor_data)

print(decoded_data)  # 输出: {'name': 'Alice', 'age': 30, 'isStudent': False, 'courses': ['Math', 'Science'], 'grades': {'Math': 90, 'Science': 85}}

总结

CBOR 是一种高效的二进制数据格式,适合用于需要快速解析和较小数据占用的场景。通过示例可以看到,如何从 JSON 数据转换为 CBOR,以及如何使用库进行编码和解码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2207222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts按需引入解决项目大小问题

背景&#xff1a; 按需加载缩减项目大小&#xff0c;提升项目性能和可用性 实现&#xff1a; 创建echarts.js main.js进行配置 页面中引用 效果 全量导入 按需加载&#xff1a;

Chrome清除nslookup解析记录 - 强制http访问 - 如何禁止chrome 强制跳转https

步骤&#xff1a; 地址栏输入 chrome://net-internals/#hsts在Delete domain 栏的输入框中输入要http访问的域名&#xff0c;然后点击“delete”按钮最后在Query domain 栏中搜索刚才输入的域名&#xff0c;点击“query”按钮后如果提示“Not found”即可&#xff01; 办法来自…

Linux系统:apt upgrade与apt update 命令的作用

一.sudo apt update命令 sudo apt update命令的主要作用是更新本地软件包列表。‌ 它不会下载或安装新的软件包&#xff0c;而是更新本地系统中软件包的列表&#xff0c;以反映远程存储库中的最新可用软件包信息。这确保了软件包管理器&#xff08;APT&#xff09;具有最新的软…

第十六周周报:单发的目标检测系列

目录 摘要 Abstract 一、SSD 1.1 模型结构 1.2 代码 二、YOLO 三、Termius 总结 摘要 本周主要学习单阶段的目标检测算法&#xff0c;如SSD、YOLO模型。详细学习了每个模型的原理&#xff0c;以及SSD和YOLO模型之间的异同。在本篇博客中将展示SSD的PyTorch实现代码&am…

Django使用uwsgi和nginx进行手动部署

在Django项目中使用uWSGI和Nginx进行部署是一种常见的生产环境配置。以下是一个详细的步骤指南&#xff0c;帮助你完成这个过程。 前提条件 有一个已经开发好的Django项目。服务器已安装Python、pip、Nginx和uWSGI。有一个有效的域名(可选&#xff0c;但推荐)。 步骤一&#xf…

CPU指令融合技术概述

什么是指令融合&#xff1f; 某些指令&#xff0c;例如add $3,$2,0, 只会使用rd/rs两个字段&#xff0c;但是这条指令却占用了全部32个bit, 这样会使得代码密度不高&#xff0c;指令域的有效利用率不高&#xff1b;这样&#xff0c;在实现某些功能的情况下&#xff0c;会使得CP…

Java创建线程池和线程池的七个核心参数

线程池的工作流程是&#xff1a;当一个任务被提交到线程池时&#xff0c;线程池会根据当前的线程数量和工作队列的状态来决定如何处理这个任务。如果当前运行的线程数量小于corePoolSize&#xff0c;则创建新线程执行任务&#xff1b;如果大于等于corePoolSize&#xff0c;则将…

毕设开源 大数据电影数据分析与可视化系统(源码+论文)

文章目录 0 前言1 项目运行效果2 设计概要3 最后 0 前言 &#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师…

完全免费安卓远程安卓方案:FRP+ADB甲壳虫方案,远程手机不是问题。

引言 在当今这个数字化时代&#xff0c;无论是在个人项目还是商业应用中&#xff0c;能够从公网访问到内网设备的能力变得越来越重要&#xff0c;尤其是安卓终端设备&#xff0c;在必要的情况下&#xff0c;从安卓远程到安卓进行紧急指导救援是未来一种重要的趋势. 通过合理的…

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一种协议&#xff0c;用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接&#xff0c;这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发&#xff0c;并于2…

3种常用的缓存读写策略详解

在详解3种常用的缓存读写之前&#xff0c;我们先要了解什么事缓存读写。 缓存读写是指在使用缓存技术时&#xff0c;对数据进行读取和更新的操作过程。缓存是一种用于提高系统性能和可扩展性的技术&#xff0c;通过减少对慢速存储&#xff08;如数据库&#xff09;的访问次数&…

CAN总线仲裁机制

文章目录 1、什么是CAN总线仲裁&#xff1f;2、仲裁机制3、仲裁过程 1、什么是CAN总线仲裁&#xff1f; CAN总线上的每个节点都能监测到总线上发送的数据&#xff0c;当总线空闲时每个节点都能够进行报文发送&#xff0c;多个节点同时发送报文时&#xff0c;最终由哪个节点来进…

中间件有哪些分类?

中间件的分类 中间件是位于操作系统和应用程序之间的软件&#xff0c;它提供了一系列服务来简化分布式系统中的应用程序开发和集成。中间件可以根据其功能和用途被分为不同的类别。以下是中间件的一些主要分类&#xff1a; 1. 通信处理&#xff08;消息&#xff09;中间件&am…

Sentinel 1.80(CVE-2021-44139)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 Report a Sentinel Security Vulnerability …

华为eNSP实验:以太网交换---MAC地址漂移防止与检测

一&#xff1a;MAC地址漂移 MAC地址漂移是一种网络攻击技术&#xff0c;它利用了网络设备&#xff08;如交换机&#xff09;的动态学习特性来改变网络流量的路径。这种攻击可能导致数据包被错误地转发到未经授权的设备上&#xff0c;从而造成信息泄露或拒绝服务攻击。为了防止…

ViirtualBox+Vagrant快速创建虚拟机,固定IP地址

ViirtualBoxVagrant配置虚拟机共分三步 1.ViirtualBox的安装 2.Vagrant的安装 3.VirtualBoxVagrant配置虚拟机 1.安装virtual Box 2.进入官网 下载 https://www.virtualbox.org/wiki/Downloads 下载对应版本 https://www.virtualbox.org/wiki/Download_Old_Builds_6_1 使用…

物联网中的远距离通信LoRa无线技术

LoRa&#xff08;Long Range Radio&#xff09;远距离无线传输技术是基于扩频调制技术的低功耗、远距离无线通信技术&#xff0c;采用扩频调制&#xff0c;通过将原始信号与一个伪随机序列进行编码&#xff0c;使得信号的带宽显著增加&#xff0c;从而在更宽的频谱上传输。这种…

《征服数据结构》并查集(DSU)

摘要&#xff1a; 1&#xff0c;并查集的介绍 2&#xff0c;并查集的查找 3&#xff0c;并查集的合并 1&#xff0c;并查集的介绍 并查集(Disjoint-set data structure&#xff0c;不交集数据结构)是用于处理一些不交集的合并以及查询问题&#xff0c;它是非常重要的一种数据结…

在 Qt 中实现可拖动的无边框 MainWindow 并设置圆角效果

在应用程序的界面设计中,很多时候我们希望窗口能够拥有更好的视觉效果,比如设置圆角以及去除默认的标题栏,使窗口看起来更加美观。此外,还需要支持用户通过鼠标拖动窗口。在本文中,我们将详细介绍如何在 Qt 中实现这些效果。 如图: 一、设置无边框窗口 Qt 提供了 Qt::F…

风格迁移-StyTr 2 : Image Style Transfer with Transformers

风格迁移-StyTr 2 : Image Style Transfer with Transformers 论文链接&#xff1a;Image Style Transfer with Transformers 源码链接&#xff1a;StyTR-2 文章目录 风格迁移-StyTr 2 : Image Style Transfer with TransformersStyTR架构图图像内容编码器内容感知位置编码&…