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

一、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中字段首字母变为小写-驼峰形式。

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值