Gson如何自定义Calendar序列化/反序列化
直接开干吧,假设有这么一个类:
@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序列化/反序列化的更多相关文章
- java基础知识-序列化/反序列化-gson基础知识
以下内容来之官网翻译,地址 1.Gson依赖 1.1.Gradle/Android dependencies { implementation 'com.google.code.gson:gson:2 ...
- GSON 特殊类型支持序列化和反序列化,如LocalDateTime
GSON 特殊类型支持序列化和反序列化,如LocalDateTime DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern ...
- php json与xml序列化/反序列化
在web开发中对象的序列化与反序列化经常使用,比较主流的有json格式与xml格式的序列化与反序列化,今天想写个jsop的小demo,结果发现不会使用php序列化,查了一下资料,做个笔记 简单数组js ...
- python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理
python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...
- C#之你懂得的序列化/反序列化
前言:写此文章一方面是为了巩固对序列化的认识,另一方面是因为本人最近在面试,面试中被问到“为什么要序列化”.虽然一直在使用,自己也反复的提到序列化,可至于说为什么要序列化,还真的没想过,所以本文就这样 ...
- java Serializable和Externalizable序列化反序列化详解--转
一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...
- springboot学习(三)——http序列化/反序列化之HttpMessageConverter
以下内容,如有问题,烦请指出,谢谢! 上一篇说掉了点内容,这里补上,那就是springmvc的http的序列化/反序列化,这里简单说下如何在springboot中使用这个功能. 使用过原生netty ...
- 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 ...
- 序列化 反序列化 MessagePack for C#
阅读目录 快速序列化组件MessagePack介绍 简介 使用 快速开始 分析器 内置的支持类型 对象序列化 DataContract兼容性 序列化不可变对象(序列化构造器) 序列化回调 Union ...
- java Serializable和Externalizable序列化反序列化详解(转载)
一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...
随机推荐
- ESP实现Web服务器
ESP实现Web服务器 典型的基于 ESP32 的静态网页与图片嵌入展示的 本地 Web Server(AP 模式)项目 项目功能概述 ESP32 创建一个 Wi-Fi 热点,启动一个 HTTP We ...
- AI赋能金融风控:基于机器学习的智能欺诈检测系统实战教程
引言 在数字化转型浪潮中,金融欺诈手段呈现智能化.隐蔽化趋势.传统规则引擎已难以应对复杂多变的欺诈模式,而机器学习技术通过自动学习数据特征,正在重塑金融风控体系.本文将基于Python生态,以信用卡欺 ...
- HashMap get和resize源码解析|Java 17
直奔主题,奉上HashMap中get 函数源码解析: public V get(Object key) { Node<K,V> e; return (e = getNode(hash(ke ...
- 解决Vditor加载Markdown网页很慢的问题(Vite+JS+Vditor)
1. 引言 在上一篇文章<使用Vditor将Markdown文档渲染成网页(Vite+JS+Vditor)>中,详细介绍了通过Vditor将Markdown格式文档渲染成Web网页的过程, ...
- 「Log」2023.8.25 小记
序幕 到校同学都没来,先摆. 写博客,写啊,写啊. 改费用流板子. \(\color{royalblue}{P3381\ [模板]最小费用最大流}\) 板子. 痛心疾首,建边的时候费用边反边为负权边. ...
- FastAPI访问令牌的权限声明与作用域管理:你的API安全真的无懈可击吗?
title: FastAPI访问令牌的权限声明与作用域管理:你的API安全真的无懈可击吗? date: 2025/06/15 06:32:07 updated: 2025/06/15 06:32:07 ...
- Linux 常用指令及客户端工具
特点 稳定 安全性高 免费 系统目录 / :系统根目录: ~:/root 管理员目录: etc:系统配置目录: home:系统为每一个除 root 以外的用户创建一个以用户名为名称的文件夹: root ...
- 袋鼠云:拥抱DeepSeek大模型,做Data+AI的长期主义者
<数据资产管理白皮书>下载地址:https://www.dtstack.com/resources/1073/?src=szsm <行业指标体系白皮书>下载地址:https:/ ...
- ET框架服务端部署到Linux--升级3.1
框架升级3.1参考:https://www.cnblogs.com/cj8988/p/14098017.html 安装.netcore 3.1 我的安装方法,直接下载文件(Centos7系统,之前安装 ...
- 三、FFmpeg学习笔记
FFmpeg是一个开源.跨平台的多媒体处理框架,能够实现音视频的录制.转换.剪辑.编码.解码.流媒体传输.过滤与后期处理等几乎所有常见的多媒体操作.其强大之处在于几乎支持所有的音视频格式.编解码器 ...