前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Gson如何自定义Calendar序列化/反序列化

Gson如何自定义Calendar序列化/反序列化

作者头像
菩提树下的杨过
发布于 2022-04-27 03:01:09
发布于 2022-04-27 03:01:09
87900
代码可运行
举报
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @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序列化出来的结果很难看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        Gson gson  = new Gson();
        BeanSample bean = new BeanSample(Calendar.getInstance());
        System.out.println(gson.toJson(bean));

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"birthday":{"year":2022,"month":3,"dayOfMonth":20,"hourOfDay":21,"minute":18,"second":13}}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        Gson gson = new GsonBuilder().registerTypeAdapter(Calendar.class, new TypeAdapter<Calendar>() {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

            @Override
            public void write(JsonWriter out, Calendar value) throws IOException {
                if (value == null) {
                    out.nullValue();
                } else {
                    out.value(sdf.format(value.getTime()));
                }
            }

            @Override
            public Calendar read(JsonReader in) throws IOException {
                //这是从json字符串反序列化的,先不管
                return null;
            }
        }).create();
        
        BeanSample bean = new BeanSample(Calendar.getInstance());
        System.out.println(gson.toJson(bean));

运行一下,居然没生效,还是刚才的格式!于是,下个断点:

发现birthday最终实例化后,类型是 GregorianCalendar(即:抽象类Calendar的子类),然后把刚才的代码略改了下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Gson gson = new GsonBuilder().registerTypeAdapter(GregorianCalendar.class, new TypeAdapter<GregorianCalendar>() {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    @Override
    public void write(JsonWriter out, GregorianCalendar value) throws IOException {
        if (value == null) {
            out.nullValue();
        } else {
            out.value(sdf.format(value.getTime()));
        }
    }

    @Override
    public GregorianCalendar read(JsonReader in) throws IOException {
        JsonToken token = in.peek();
        switch (token) {
            case NUMBER:
                Date d = new Date(in.nextLong());
                GregorianCalendar c = new GregorianCalendar();
                c.setTime(d);
                return c;
            case STRING:
                String s = in.nextString();
                try {
                    Date parse = sdf.parse(s);
                    GregorianCalendar instance = new GregorianCalendar();
                    instance.setTime(parse);
                    return instance;
                } catch (ParseException e) {
                    e.printStackTrace();
                    return null;
                }
            case NULL:
            default:
                return null;
        }
    }
}).create();


BeanSample bean = new BeanSample(new GregorianCalendar());

//序列化
String json = gson.toJson(bean);
System.out.println(json);

//反序列化
System.out.println(gson.fromJson(json, BeanSample.class));

System.out.println("--------");

//换成时间戳格式
json = "{\"birthday\":" + System.currentTimeMillis() + "}";
System.out.println(json);
System.out.println(gson.fromJson(json, BeanSample.class));

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"birthday":"2022-04-20 22:27:08.864"}
2022-04-20 22:27:08.864
--------
{"birthday":1650464828881}
2022-04-20 22:27:08.881

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Gson的学习与使用
GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。
用户1134788
2022/05/09
1.6K0
Gson的学习与使用
SpringMVC+GSON 对象序列化--日期格式的处理
Gson异常强大因此使用它代替了Jackson作为SpringMVC消息转换器。 在自己的项目中,发现对象在序列化后,日期格式出现了问题。 先看问题 在员工表中有一列是生日,字段类型为Date,也就是
用户2193479
2018/06/28
2.5K0
如何更好的使用Gson
今天想分享一些工作中遇到的关于gson的坑,这么说其实不太准确,因为不能算是gson的坑,更多的是因为旧代码产生了一些不规范的数据导致使用gson时遇到了一些问题。
Jackeyzhe
2020/06/14
1.6K0
Android 序列化框架 Gson 原理分析,可以优化吗?
Gson[1] 是 Google 推出的 Java Json 解析库,具有接入成本低、使用便捷、功能扩展性良好等优点,想必大家都很熟悉了。在这篇文章里,我们将讨论 Gson 的基本用法和以及主要流程的源码分析。
用户9995743
2022/12/22
2.4K0
Android 序列化框架 Gson 原理分析,可以优化吗?
Gson自定义处理Calendar日期Date时间类型
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。Gson对一般类型的序列化和反序列话都没有问题,但是像Calendar日期这样的类型,可能需要手动处理下            
kl博主
2023/11/18
2890
Gson自定义处理Calendar日期Date时间类型
GSON 简单使用
student类     public class Student { private int id; private String name; private Date birthDay; public int getId() { return id; } public void setId(int id) { this.id = id; } public Stri
用户7999227
2021/09/23
7190
人生苦短,我用Gson
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 JSON 键值对是用来保存JS对象的一种方式,和JS对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值,如下例子所示:
你呀不牛
2021/05/28
2.2K0
大型项目废弃fastjson迁移至Gson保姆级攻略
在被大家取关之前,我立下一个“远大的理想”,一定要在这周更新文章。现在看来,flag有用了。。。
蛮三刀酱
2021/01/13
1.9K0
Android Study 之 彻底解决 Gson解析 异常 :JsonSyntaxException
开发过程中,App常用的接收参数的时候,几乎大部分都是以json格式为主,那么有关解析json的方式有很多,Android端相对来说使用Gson比较多,而在解析过程中,如果你遇到规范的后台,那你大可放心随便浪,But,如果遇到神后台,那么,呵呵了你就。真的想不到还会出现什么问题。。。
贺biubiu
2019/06/10
4.6K0
Gson 笔记
要使用GSON库,Gson类需要实例化一个 com.google.GSON 的对象。GSON对象不维护任何状态,这个特性有助于在多个地方重用GSON对象。
Remember_Ray
2020/03/09
3.7K0
Java-json序列化和反序列化
java开发中经常会遇到json的序列化与反序列化,常用的json序列化工具有阿里的Fastjson、spring mvc内置的Jackson、还有就是我们接下来要说的谷歌的Gson。
Vincent-yuan
2021/04/01
4.8K0
Java中的JSON序列化和反序列化
JSON 起源于 1999 年的 JS 语言规范 ECMA262 的一个子集,后来 2003 年作为一个数据格式ECMA404(404???)发布。 2006 年,作为 rfc4627 发布,这时规范增加到 18 页,去掉没用的部分,十页不到。
鱼找水需要时间
2023/03/23
2.3K0
Java中的JSON序列化和反序列化
Java中Json字符串和Java对象的互转
Json(JavaScript Object Notation)是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。Json 是目前主流的前后端数据传输方式。
栗筝i
2023/03/08
3.2K0
gson TypeAdapter 和FieldNamingStrategy,SerializedName实现属性名称的设置别名
gson TypeAdapter 和FieldNamingStrategy,SerializedName实现属性名称的设置别名
oktokeep
2024/10/09
1150
FastJSON、Gson、Jackson(简单了解使用)[通俗易懂]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说FastJSON、Gson、Jackson(简单了解使用)[通俗易懂],希望能够帮助大家进步!!!
Java架构师必看
2022/02/09
4.5K0
FastJSON、Gson、Jackson(简单了解使用)[通俗易懂]
Gson 简单使用姿势小结
关于 Json 序列化的框架可以说比较多了,比如 Spring 默认的 Jackson,国内互联网用的比较多的 FastJson,本文则主要介绍一下 Gson 的简单使用姿势,并不会涉及到不同的 json 框架的性能对比
一灰灰blog
2020/10/26
7880
Gson 简单使用姿势小结
Android框架-Google官方Gson解析
而 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,广泛应用于各种数据的交互中,尤其是服务器与客户端的交互。
Android技术干货分享
2019/03/26
1.1K0
Android框架-Google官方Gson解析
去fastjson笔记
fastjson近些年频频爆出安全漏洞,现在已经是互联网的过街老鼠了,建议早去早好,网上搜索了下,相对而言google出品的gson目前还没听说有重大安全问题。下面是gson替换fastjson可能会遇到的一些坑。
菩提树下的杨过
2020/06/16
8210
除了FastJson,你还有选择: Gson简易指南
前几天被几个技术博主的同一篇公众号文章 fastjson又被发现漏洞,这次危害可导致服务瘫痪! 刷屏,离之前漏洞事件没多久,fastjson 又出现严重 Bug。目前项目中不少使用了 fastjson 做对象与JSON数据的转换,又需要更新版本重新部署,可以说是费时费力。与此同时,也带给我新的思考,面对大量功能强大的开源库,我们不能盲目地引入到项目之中,众多开源框架中某个不稳定因素就足以让一个项目遭受灭顶之灾。趁着周末,在家学习下同样具备JSON与对象转换功能的优秀开源框架 Gson,并且打算将今后项目使用 fastjson 的地方逐渐换成使用 Gson,记录下学习总结的内容,希望对小伙伴也有所帮助。
闻人的技术博客
2019/09/18
1.7K0
除了FastJson,你还有选择: Gson简易指南
实现自定义序列化和反序列化控制的5种方式
你可以编写自定义的序列化器(Serializer)和反序列化器(Deserializer),并将它们应用到特定的类或属性上。通过实现 JsonSerializer 和 JsonDeserializer 接口,你可以完全控制序列化和反序列化过程中的行为,包括如何读取属性、生成 JSON 或者解析 JSON 等。
公众号:码到三十五
2024/03/19
1.8K0
相关推荐
Gson的学习与使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验