fastjson用java转json时间的格式化

2023-05-16

一、项目中需求遇到需要接收其他应用数据,通过@RequestBody注解接收参数后,到本地利用fastJson把json格式化。
需要注意一下几点:

  1. 需要在调用JSON.toJSONString()的时候加上SerializerFeature.DisableCircularReferenceDetect和SerializerFeature.WriteDateUseDateFormat参数。
JSON.toJSONString(dto.getApplyInfos(),SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteDateUseDateFormat));
  1. 需要在转换的实体上加如下注解:
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd'T'HH:mm:ss")
private Date insertTime;

二、SpringBoot(SpringMVC)序列化和反序列化Json时默认使用的是Jackson(例如使用@RequestBody反序列化前端传递过来的Json字符串时),
当我们前端使用Json字符串传递到后台时日期格式可能是时间戳(即long类型的数字),也有可能是日期字符串(如:“yyyy-MM-dd”, “yyyy-MM-dd HH:mm”, “yyyy-MM-dd HH:mm:ss”)等等。
如果是时间戳或者是yyyy-MM-dd格式的日期,Jackson会自动识别并且转换成功,若是yyyy-MM-dd HH:mm:ss这种格式的日期字符串的话,Jackson无法自动转换成Date类型。

这里有几种解决方案,如下:

  1. 我们可以在需要被反序列化的日期属性上添加com.fasterxml.jackson.annotation.JsonFormat注解,如下:

image
这个注解对于Jackson序列化以及反序列化均起作用(即将日期对象序列化成Json时格式为以上指定的格式,将Json反序列化成日期时会按照以上指定的日期格式进行解析,若日期字符串的格式不满足以上指定的格式将会直接报错)

  1. 方法一我们只能指定一种日期的格式,但是我们前端可能传递各种类型的日期格式,这个时候我们需要自定义Json日期转换器,如下在日期类型的属性上添加com.fasterxml.jackson.databind.annotation.JsonDeserialize注解,如下:
    在这里插入图片描述
    其中DateJacksonConverter类是我们自定义的日期转换类,这时在反序列化时我们可以转换多种格式的日期,DateJacksonConverter类定义如下:
package com.msun.middle.business.ascs.api.common.util;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;

/**
 * @classDesc: 功能描述 :自定义Jackson反序列化日期类型时应用的类型转换器,一般用于@RequestBody接受参数时使用
 * @author: mhp
 * @date: 2021/11/21 14:51
 * @fileName : DateJacksonConverter
 */
public class DateJacksonConverter extends JsonDeserializer<Date> {
    private static String[] pattern =
        new String[]{"yyyy-MM-dd", "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.S",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm:ss.S",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss.S"};

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {

        Date targetDate = null;
        String originDate = p.getText();
        if (StringUtils.isNotEmpty(originDate)) {
            try {
                long longDate = Long.valueOf(originDate.trim());
                targetDate = new Date(longDate);
            } catch (NumberFormatException e) {
                try {
                    targetDate = DateUtils.parseDate(originDate, DateJacksonConverter.pattern);
                } catch (ParseException pe) {
                    throw new IOException(String.format(
                        "'%s' can not convert to type 'java.util.Date',just support timestamp(type of long) and following date format(%s)",
                        originDate,
                        StringUtils.join(pattern, ",")));
                }
            }
        }

        return targetDate;
    }

    @Override
    public Class<?> handledType() {
        return Date.class;
    }
}


	在该方法中handledType()方法可以不用重写。
  1. 以上两种方法都需要在实体类上添加注解,这种方式污染了实体类,并且要是类太多的话,添加注解是一个麻烦事,这时我们可以配置全局的日期类型转换器,如下:
package com.flying.eurekaclient;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

@Configuration
public class ConverterConfig {
    @Bean
    public DateJacksonConverter dateJacksonConverter() {
        return new DateJacksonConverter();
    }

    @Bean
    public Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean(
            @Autowired
                    DateJacksonConverter dateJacksonConverter) {
        Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean = new Jackson2ObjectMapperFactoryBean();

        jackson2ObjectMapperFactoryBean.setDeserializers(dateJacksonConverter);
        return jackson2ObjectMapperFactoryBean;
    }

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(
            @Autowired
                    ObjectMapper objectMapper) {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter =
                new MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
        return mappingJackson2HttpMessageConverter;
    }
}

采用这种方式我们自定义的DateJacksonConverter必须重写handledType()方法。

本人推荐采用方式三,这样不用污染实体类。

以下附上方式三的xml文件配置(若没有使用SpringBoot的话):

在这里插入图片描述
在这里插入图片描述
Tips:

1.关于使用SpringMVC接受前端传递过来的QueryParameter数据(即后台使用@RequestParam接收)或者formdata数据(后台采用@RequestParam或者直接用对象接收),

若其中存在日期数据,则可以采用以下博客提到的方式进行日期类型的正确转换:

https://my.oschina.net/u/2608182/blog/713435

2.关于Jackson的基本用法参考:https://my.oschina.net/u/2608182/blog/731403

下半部分 refer to:
https://my.oschina.net/u/2608182/blog/2877624

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fastjson用java转json时间的格式化 的相关文章

随机推荐

  • 使用c/c++将十六进制的stl字符串转换成IEEE - 754 浮点数

    span class token keyword typedef span span class token keyword union span span class token punctuation span span class t
  • 使用 C++ 处理 JSON 数据交换格式

    使用 C 43 43 处理 JSON 数据交换格式 一 摘要 JSON 的全称为 xff1a JavaScript Object Notation xff0c 顾名思义 xff0c JSON 是用于标记 Javascript 对象的 xff
  • C++ -- 智能指针( C++11与boost库的智能指针及其使用)

    1 智能指针的引入 1 在动态内存管理中 xff0c 如果new上一块空间 xff0c 但是没有delete xff0c 就会产生内存泄露的问题 2 但是有时候 xff0c 我们new了 xff0c 也delete了 xff0c 但是还会出
  • 动态库与静态库区别

    首先 xff0c 两者最重要的区别在于该库是否被编译进目标程序当中 静态库 xff1a 该库在编译的时候会直接整合到目标程序当中 xff0c 也就是说 xff0c 每个程序的静态库都是独立的 这样使得文件比较大 而且因为是编译的的时候整合进
  • 解决ubuntu20.04虚拟机无法上网的问题

    64 linux虚拟机无法正常上网 前言 刚建立好的linux虚拟机使用NAT方式可以连接外网 xff0c 系统重启几次 xff0c 系统无法上网 xff0c 这是什么问题导致的呢 xff1f 提示 xff1a 以下是本篇文章正文内容 xf
  • Arduino系列教程之 – PWM的秘密

    转载地址 xff1a http www diy robots com p 61 814 感谢作者的翻译 PWM是啥玩意儿 xff1f PWM是 怕玩命 的缩写 xff0c 英文写法是 Pulse width modulation xff0c
  • YOLOv2代码分析_读取labels[by zhangzexuan]

    YOLOv2代码分析 读取labels by zhangzexuan YOLOv2代码分析 读取labelsby zhangzexuan YOLOv2的输入代码阅读 嗯 现在参与的项目要求在人脸检测步骤直接连同人脸特征点一起预测出来 xff
  • 【企业微信】获取token & 发送应用消息

    企业微信获取token 存入redis 设置时长2小时 amp amp 发送企业应用消息接口 1 常量类 span class token keyword package span span class token namespace co
  • 学习笔记--HTTP-字段总结(一)-与传输实体相关的报文字段总结

    目录 一 概述 二 介绍一些常用字段 三 传输实体的一些属性 1 传输的数据类型 2 实体的语言类型和编码 3 编码类型 四 文件类型和压缩编码字段 1 Accept 2 Content Type 3 Accept Encoding 4 C
  • C/C++ 去掉宏定义__FILE__路径

    一 问题 在日志模块中往往带着文件信息 xff0c 有的源文件是加载其他路径下的源文件 xff0c 但是不想让别人看到文件路径信息 xff0c 只显示源文件的名字和行数即可 如下图所示 xff0c 有烦人的相对路径 二 解决方案 自定义一个
  • C语言提高(一)

    C语言提高 CS和BS的区别函数封装和数组形参退化为指针数据类型本质变量的本质内存分区模型全局区以文字常量区为例分析全局区 栈区堆区 函数的调用模型函数调用变量传递分析静态局部变量的使用栈地址的生长方向堆地址的生长方向内存的存放方向 以数组
  • ROS Gazebo(三):启动gazebo/URDF

    打开Gazebo的方式主要有两种 xff1a rosrun 和 roslaunch 1 启动ROS节点 启动ROS节点 bring up 机器人的标准工具是roslaunch 打开一个空的Gazebo世界命令如下 xff1a roslaun
  • Windows与Ubuntu之间通过网线传输文件

    一 windows与Ubuntu之间网线直连搭建局域网 把网线连好后 xff0c 在两个系统中做以下设置 Windows下的配置 右键右下角的网络图标 xff08 或者右键网络 属性 xff09 更改适配器设置 以太网 右键属性 TCP I
  • Jetson TX2——CAN口的使用

    Jetson TX2 之CAN口的使用 TX2上有2个CAN控制器 xff0c CAN控制器需要通过CAN收发器连接到物理总线上 具体参阅原理图和相关技术参考手册 下载地址 xff1a https developer nvidia com
  • Jetson TX2——串口的使用(TTL-RS485)

    Jetson TX2之串口的使用 xff08 TTL RS485 xff09 TX2串口设备 TX2 有5个 UARTs 到主连接器 其中UART3 用于 WLAN BT 有关 UARTs 的典型任务 请参见下表 查看可用串口设备 xff1
  • 面试题知识点全纪录---容器

    注意 xff1a 该博客仅是本人对掌握知识的测试 xff0c 具体内容请移步guide哥网站 xff01 xff01 xff01 https snailclimb gitee io javaguide 链接 JAVA集合框架 https w
  • 高并发-消息队列

    一 消息队列 消息队列在分布式系统中主要是为了解耦和削峰 什么是消息队列 我们可以把消息队列看作是一个存放消息的容器 xff0c 当我们需要使用消息的时候 xff0c 直接从容器中取出消息供自己使用即可 消息队列是分布式系统中重要的组件之一
  • Ublox-M8N GPS接收机UBX协议解析

    Ublox M8N GPS接收机UBX协议解析 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Java清空List方法

    1 用list clear 方法清空list xff1b 用此方法 xff0c 其它引用该list的值也会变成空 2 用list 61 null来清空list 3 new ArrayList 来清空list
  • fastjson用java转json时间的格式化

    一 项目中需求遇到需要接收其他应用数据 xff0c 通过 64 RequestBody注解接收参数后 xff0c 到本地利用fastJson把json格式化 需要注意一下几点 xff1a 需要在调用JSON toJSONString 的时候