直接开干吧,假设有这么一个类:

    @Data
@AllArgsConstructor
class BeanSample {
public Calendar birthday; @Override
public String toString() {
if (birthday == null) {
return "birthday:null";
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
return sdf.format(birthday.getTime());
}
}

默认情况下,Gson序列化出来的结果很难看:

        Gson gson  = new Gson();
BeanSample bean = new BeanSample(Calendar.getInstance());
System.out.println(gson.toJson(bean));

输出:

{"birthday":{"year":2022,"month":3,"dayOfMonth":20,"hourOfDay":21,"minute":18,"second":13}}

以我多年的搬砖经验,加个TypeAdapter应该就可以了:

import com.google.gson.*;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar; /**
* @author 菩提树下的杨过(yjmyzz.cnblogs.com)
* @className CalendarTest
* @description Calendar GSON测试
* @date 2022/5/12 22:38
*/
public class CalendarTest { public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Gson gson = new GsonBuilder()
.registerTypeAdapter(GregorianCalendar.class, (JsonSerializer<Calendar>) (src, typeOfSrc, context) -> {
//序列化
if (src == null) {
return JsonNull.INSTANCE;
}
return new JsonPrimitive(sdf.format(src.getTime()));
}).registerTypeAdapter(Calendar.class, (JsonDeserializer<Calendar>) (json, typeOfT, context) -> {
//反序列化
if (json.isJsonNull() || json.getAsString().equals("") || json.getAsString().equalsIgnoreCase("null")) {
return null;
} if (json.isJsonPrimitive()) {
JsonPrimitive asJsonPrimitive = json.getAsJsonPrimitive();
//兼容long型时间戳
if (asJsonPrimitive.isNumber()) {
Calendar instance = Calendar.getInstance();
instance.setTimeInMillis(asJsonPrimitive.getAsLong());
return instance;
}
//按字符串解析
if (asJsonPrimitive.isString()) {
try {
Date date = sdf.parse(json.getAsString());
Calendar instance = Calendar.getInstance();
instance.setTime(date);
return instance;
} catch (Exception e) {
}
}
}
return null;
}).create(); BeanSample bean = new BeanSample(Calendar.getInstance()); //序列化
String json = gson.toJson(bean);
System.out.println(json); //反序列化
System.out.println(gson.fromJson(json, BeanSample.class)); System.out.println("--------"); //换成时间戳格式
json = "{\"birthday\":" + bean.birthday.getTimeInMillis() + "}";
System.out.println(json);
System.out.println(gson.fromJson(json, BeanSample.class));
}
}

输出:

{"birthday":"2022-05-12 23:00:12.162"}
2022-05-12 23:00:12.162
--------
{"birthday":1652367612162}
2022-05-12 23:00:12.162

这样看起来好多了,而且json反序列化时,时间戳long型数字也一并做了兼容

注:gson的其它小技巧,可参考先前写的文章 去fastjson笔记

Gson如何自定义Calendar序列化/反序列化的更多相关文章

  1. java基础知识-序列化/反序列化-gson基础知识

    以下内容来之官网翻译,地址 1.Gson依赖 1.1.Gradle/Android dependencies { implementation 'com.google.code.gson:gson:2 ...

  2. GSON 特殊类型支持序列化和反序列化,如LocalDateTime

    GSON 特殊类型支持序列化和反序列化,如LocalDateTime DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern ...

  3. php json与xml序列化/反序列化

    在web开发中对象的序列化与反序列化经常使用,比较主流的有json格式与xml格式的序列化与反序列化,今天想写个jsop的小demo,结果发现不会使用php序列化,查了一下资料,做个笔记 简单数组js ...

  4. python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理

    python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...

  5. C#之你懂得的序列化/反序列化

    前言:写此文章一方面是为了巩固对序列化的认识,另一方面是因为本人最近在面试,面试中被问到“为什么要序列化”.虽然一直在使用,自己也反复的提到序列化,可至于说为什么要序列化,还真的没想过,所以本文就这样 ...

  6. java Serializable和Externalizable序列化反序列化详解--转

    一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...

  7. springboot学习(三)——http序列化/反序列化之HttpMessageConverter

    以下内容,如有问题,烦请指出,谢谢! 上一篇说掉了点内容,这里补上,那就是springmvc的http的序列化/反序列化,这里简单说下如何在springboot中使用这个功能. 使用过原生netty ...

  8. Spark:将RDD[List[String,List[Person]]]中的List[Person]通过spark api保存为hdfs文件时一直出现not serializable task,没办法找到"spark自定义Kryo序列化输入输出API"

    声明:本文转自<在Spark中自定义Kryo序列化输入输出API>   在Spark中内置支持两种系列化格式:(1).Java serialization:(2).Kryo seriali ...

  9. 序列化 反序列化 MessagePack for C#

    阅读目录 快速序列化组件MessagePack介绍 简介 使用 快速开始 分析器 内置的支持类型 对象序列化 DataContract兼容性 序列化不可变对象(序列化构造器) 序列化回调 Union ...

  10. java Serializable和Externalizable序列化反序列化详解(转载)

    一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...

随机推荐

  1. ESP实现Web服务器

    ESP实现Web服务器 典型的基于 ESP32 的静态网页与图片嵌入展示的 本地 Web Server(AP 模式)项目 项目功能概述 ESP32 创建一个 Wi-Fi 热点,启动一个 HTTP We ...

  2. AI赋能金融风控:基于机器学习的智能欺诈检测系统实战教程

    引言 在数字化转型浪潮中,金融欺诈手段呈现智能化.隐蔽化趋势.传统规则引擎已难以应对复杂多变的欺诈模式,而机器学习技术通过自动学习数据特征,正在重塑金融风控体系.本文将基于Python生态,以信用卡欺 ...

  3. HashMap get和resize源码解析|Java 17

    直奔主题,奉上HashMap中get 函数源码解析: public V get(Object key) { Node<K,V> e; return (e = getNode(hash(ke ...

  4. 解决Vditor加载Markdown网页很慢的问题(Vite+JS+Vditor)

    1. 引言 在上一篇文章<使用Vditor将Markdown文档渲染成网页(Vite+JS+Vditor)>中,详细介绍了通过Vditor将Markdown格式文档渲染成Web网页的过程, ...

  5. 「Log」2023.8.25 小记

    序幕 到校同学都没来,先摆. 写博客,写啊,写啊. 改费用流板子. \(\color{royalblue}{P3381\ [模板]最小费用最大流}\) 板子. 痛心疾首,建边的时候费用边反边为负权边. ...

  6. FastAPI访问令牌的权限声明与作用域管理:你的API安全真的无懈可击吗?

    title: FastAPI访问令牌的权限声明与作用域管理:你的API安全真的无懈可击吗? date: 2025/06/15 06:32:07 updated: 2025/06/15 06:32:07 ...

  7. Linux 常用指令及客户端工具

    特点 稳定 安全性高 免费 系统目录 / :系统根目录: ~:/root 管理员目录: etc:系统配置目录: home:系统为每一个除 root 以外的用户创建一个以用户名为名称的文件夹: root ...

  8. 袋鼠云:拥抱DeepSeek大模型,做Data+AI的长期主义者

    <数据资产管理白皮书>下载地址:https://www.dtstack.com/resources/1073/?src=szsm <行业指标体系白皮书>下载地址:https:/ ...

  9. ET框架服务端部署到Linux--升级3.1

    框架升级3.1参考:https://www.cnblogs.com/cj8988/p/14098017.html 安装.netcore 3.1 我的安装方法,直接下载文件(Centos7系统,之前安装 ...

  10. 三、FFmpeg学习笔记

    ​ FFmpeg是一个开源.跨平台的多媒体处理框架,能够实现音视频的录制.转换.剪辑.编码.解码.流媒体传输.过滤与后期处理等几乎所有常见的多媒体操作.其强大之处在于几乎支持所有的音视频格式.编解码器 ...