Gson与FastJson比较
一. 简介和优劣1.Google的GsonGson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。 类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。 Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。 2.阿里巴巴的FastJsonFastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。 FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。 3. 其他json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。json-lib在功能和性能上面都不能满足现在互联网化的需求。 综上,在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用, 二、基本使用方式Gson //解成对象 Fromat mFromat = new Gson().fromJson(jsonStringObject,Fromat.class); //解成对象组 LinkedList<Fromat> list = new LinkedList<MainActivity.Fromat>(); Type type = new TypeToken<LinkedList<Fromat>>(){}.getType(); list = new Gson().fromJson(jsonStringArray,type); //泛型统一封装时 需要传个 type 进来 new TypeToken<LinkedList<Fromat>>(){}.getType(); fromJson(String json,Type typeOfT) public <T> T fromJson(String json,Type typeOfT) fastJson //解析成对象 Fromat fastjsonObject = JSON.parSEObject(jsonObjectString,Fromat.class); //解析成对象组 List<Fromat> fastjsonArray = JSON.parseArray(jsonArrayString,Fromat.class); //泛型统一封装时 需要传个 type 进来 或者TypeReference 也可以也是调用的type new TypeReference<Fromat>() {} new TypeReference<Fromat>() {}.getType() public static <T> T parSEObject(String input,Type clazz,Feature... features) public static <T> T parSEObject(String text,TypeReference<T> type,Feature... features) 三、细节比较1、属性和set方法名称不一致时现在我有这么一个Bean,属性名为firstName,但是它的set方法却是setName(),而不是setFirstName() @Test public void toJson() { Bean bean = new Bean(); bean.setAge(24); bean.setName("扎巴也"); //方法是setName,属性是firstName String fastJson = JSON.toJSONString(bean); System.out.println("fastJson=" + fastJson); String gson = new Gson().toJson(bean); System.out.println("gson=" + gson); } 输出结果: fastJson={"age":24,"name":"扎巴也"} gson={"firstName":"扎巴也","age":24} 序列化时fastJson是按照set方法的名字来转换的,而gson则是按照属性的名字来转换的。 不信?好,我们再来看看反序列化时会怎样? @Test public void fromJson() { String json = "{"age":24,"name":"扎巴也"}"; Bean fastjson = JSON.parSEObject(json,Bean.class); System.out.println("fastJson=" + fastjson.toString()); Bean gson = new Gson().fromJson(json,Bean.class); System.out.println("gson=" + gson.toString()); } 输出结果: fastJson=Bean{firstName=‘扎巴也‘,age=24} gson=Bean{firstName=‘null‘,age=24} 因为Bean类里面有name的set方法,所以fastJson解析时调用了setName,所以firstName有值 2、有属性,无set方法现在我有这么一个Person,属性名为name,但是它没有name的set方法 {"age":24,"name":"扎巴也"} 测试代码: @Test public void fromJsonNoSet() { String json = "{"age":24,"name":"扎巴也"}"; Person fastjson = JSON.parSEObject(json,Person.class); System.out.println("fastJson=" + fastjson.toString()); Person gson = new Gson().fromJson(json,Person.class); System.out.println("gson=" + gson.toString()); } 输出结果: fastJson=Person{name=‘null‘,age=24} gson=Person{name=‘扎巴也‘,age=24} 因为Person没有name的set方法,所以fastJson解析的name为null 再次证明,fastJson是按照set方法的名字来转换的,而gson则是按照属性的名字来转换的。 那么,无属性,有set方法时,两者有什么区别呢?(其实没有属性的话,set方法调用了没啥作用) @Test public void fromJsonNoFiled() { String json = "{"age":24,"name":"扎巴也"}"; Student fastjson = JSON.parSEObject(json,Student.class); System.out.println("fastJson=" + fastjson.toString()); Student gson = new Gson().fromJson(json,Student.class); System.out.println("gson=" + gson.toString()); } 输出结果: 调用了setName:扎巴也 fastJson=Student{age=24} gson=Student{age=24} fastJson调用了set方法,而gson没有调用set方法。 3、无默认的无参构造方法现在有这么一个Teacher类,他只有一个两个参数的构造方法,没有默认的无参构造方法,那么,我来解析这样一个字符串时,FastJson和Gson会有什么区别呢? {"age":24,"name":"扎巴也"} 测试代码: @Test public void fromJsonNoDefaultConstructor() { String json = "{"age":24,"name":"扎巴也"}"; Teacher gson = new Gson().fromJson(json,Teacher.class); System.out.println("gson=" + gson.toString()); Teacher fastjson = JSON.parSEObject(json,Teacher.class); System.out.println("fastJson=" + fastjson.toString()); } 这里,Gson可以正常的解析,但是,fastJson则会报错,因为没有默认的无参构造方法。 4、有默认的无参构造方法@Test public void fromJsonHasDefaultConstructor() { String json = "{"age":24,"name":"扎巴也"}"; Boss gson = new Gson().fromJson(json,Boss.class); System.out.println("gson=" + gson.toString()); Boss fastjson = JSON.parSEObject(json,Boss.class); System.out.println("fastJson=" + fastjson.toString()); } gson和fastJson都调用了默认的无参构造方法. 四、Gson中使用泛型例:JSON字符串数组 数组比较简单 Gson gson = new Gson(); String jsonArray = "["Android","Java","PHP"]"; String[] strings = gson.fromJson(jsonArray,String[].class); 但对于List将上面的代码中的 String[].class 直接改为 List 为了解决的上面的问题,Gson为我们提供了TypeToken来实现对泛型的支持,所以当我们希望使用将以上的数据解析为List Gson gson = new Gson(); String jsonArray = "["Android",String[].class); List<String> stringList = gson.fromJson(jsonArray,new TypeToken<List<String>>() {}.getType()); 注:TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken 参考: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |