暂无图片
暂无图片
4
暂无图片
暂无图片
4
暂无图片

论Google的Gson与Alibaba的FastJson序列化机制

原创 每天译点晓知识 2021-11-16
12022

 

一、gson.toJson()gson.fromJson()

(方法1)、gson.toJson(Object src);
(方法2)、gson.fromJson(String json, Type typeOfT);
复制

i、传递的参数封装在map里(并包含空格等一些特殊的字符),转实体对象自定义日期格式:

Gson gson = new Gson();
复制

1、基于日期格式转换

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
复制

2、空值null也可序列化

Gson gson = new GsonBuilder().serializeNulls().create();
复制

3、可定制不同的转换策略,其中自定义工厂适配器GsonConvertAdapterFactory需实现TypeAdapterFactory接口

Gson gson = new GsonBuilder().registerTypeAdapterFactory(
new GsonConvertAdapterFactory<>()).create();
复制

方法1):通过gson.toJson()方法可将Object转为json串;

方法2):通过gson.fromJson(strJson,ToTurn.class)转为对应的实体对象(strJson为json串,ToTurn.class为待转化的自定义类)。

ii、集合数据类型转换:

List<Long> ids = gson.fromJson(msg.getBody().toString(), 
new TypeToken<List<Long>>(){}.getType());
复制

若上述json串中包含整形数字,或当Integer类型被转为Double时,可使用Double类对其包含的整形数字先进行转换再获取值intValue();

二、json.toJSONString(Object object)与json.parseObject(String text, Class<T> clazz) 

其中JSON类与JSONObject类都可以转换,后者是static-静态方法:

(类1)、JSON.toJSONString(Object object) 与 JSON.parseObject(String text, Class<T> clazz);
(类2)、JSONObject.toJSONString(Object object) 与 JSONObject.parseObject(String text, Class<T> clazz);
复制

三、Gson与FastJson与Java内省机制

Gson与FastJson在前俩小结已提到,Java内省机制->这里引入wiki的解释:

在计算机科学中,内省是指计算机程序在运行时(Runtime)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查。相对于内省,其实反射更进一步,是指计算机程序在运行时(Runtime)可以访问、检测和修改它本身状态或行为的一种能力。

在项目中常用的反射,则是强调在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法。 内省(IntroSpector)则是Java 语言对 Bean 类属性、事件的一种缺省处理方法。其中JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,其方法名符合某种命名规则。若在两个模块之间传递信息,可将信息封装进JavaBean中,这种对象称为“值对象”(Value Object)或 “VO”,通过set()、get()方法获得,内省机制通过反射来实现。

Ok,Now,名词解释就不再赘述,那Google的Gson与Alibaba的FastJson序列化机制在Java内省机制下又有何不同之处呢,它们分别是怎么处理?

其实,当我们使用阿里巴巴的fastjson时,它会将bean中字段首字母变为小写,当接口请求参数上送严格要求有大小写区分的时候,这样则肯定会出问题,当然可以通过以下方式解决:

i、在bean对象的属性名称加上@JSONField(name = "")注解+类上加@Data注解.

 ii、json序列化的时候加参数,将首字母强制转换大写.

那在bean对象中有些属性首字母需要大写,有些属性首字母需要小写,如何更优雅的处理应对?

接下来,我们一起来看谷歌的gson。

iii、这里采用静态内部类-单例模式

其中序列化方法GsonUtil.util().toJsonString(),

重要:当第一次加载GsonUtil类时不会去初始化value,不占内存,只有第一次调用util时,虚拟机加载singletonBuild并初始化value,因为构造私有,以静态方法或者枚举返回实例,确保实例只有一个,尤其是在多线程环境,所以这样静态类不仅能保证线程安全,还能确保GsonUtil类的唯一性,同时也延迟了单例的实例化,但需要传递参数的话,外部无法传递,可结合DCL模式双重锁懒汉模式(Double Check Lock),当然枚举类也可实现单例模式。 

回到正文,不难看出,gson解决了对象属性名大写自动变为小写问题,即转换bean对象后依旧是原本属性名,并不会像fastjson出现将bean中字段首字母变为小写-驼峰形式。


「 往期文章 」


数据库在线实训平台-MySQL篇

Java | JDK 1.8 Lambda表达式实用指南

序列化 | Google的Gson与Alibaba的FastJson机制

Elasticsearch进阶篇 | 记kibana执行dsl脚本实战过程

Oracle优化案例 | 从执行计划定位SQL查询问题

Kafka | 记一次修复Kafka分区所在broker宕机故障-引发当前分区不可用的思考过程

达梦 | 记一次国产数据库适配的思考过程

      








最后修改时间:2021-11-16 11:31:49
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

墨天轮福利君
暂无图片
3年前
评论
暂无图片 0
🎁您好,您的文章阅读量已经达到3000,为您派送额外的墨值流量收益!
3年前
暂无图片 点赞
1
墨天轮福利君
暂无图片
3年前
回复
暂无图片 0
您的文章阅读量已达到400,为您补发额外的流量收益!
3年前
暂无图片 点赞
回复
墨天轮福利君
暂无图片
3年前
评论
暂无图片 0
🎁您好,您的文章阅读量已经达到1000,为您派送100墨值的流量收益!
3年前
暂无图片 点赞
评论
墨天轮福利君
暂无图片
3年前
评论
暂无图片 0
您好,您的文章已入选合格奖,10墨值奖励已经到账请查收! ❤️我们还会实时派发您的流量收益。
3年前
暂无图片 点赞
评论