Java 中FastJson的基本使用
FastJSON是一个Java语言编写的高性能,功能完善,完全支持http://json.org的标准的JSON库。
在开发Android的过程中,如果我们经常与服务器打交道,更新数据等等,那么json必然是个好的数据格式,但是有了json我们要解析它,使用原生的解析也可以,但是很不高效,所以这里介绍两种json数据解析的方式,
一种是FastJSon,这个是阿里巴巴出的,号称最快的解析速度。
第二种使我们伟大的Google提供的Gson来解析json,两个解析json都很方便,而且都很强大,在我使用中,基本上都满足了我的需求,下面简单就接受一下,我们的使用方法。
首先建立两个实体类,Student.java和Teacher.java
Student.java和Teacher.java的代码如下:
packagecom.android.fastjson.bean; publicclassStudent{ privateintid; privateStringname; privateintage; /** *默认的构造方法必须不能省,不然不能解析 */ publicStudent(){ } publicStudent(intid,Stringname,intage){ this.id=id; this.name=name; this.age=age; } publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } @Override publicStringtoString(){ return"Student[id="+id+",name="+name+",age="+age+"]"; } }
packagecom.android.fastjson.bean; importjava.util.List; publicclassTeacher{ privateintid; privateStringname; privateListstudents; /** *默认的构造方法必须不能省,不然不能解析 */ publicTeacher(){ } publicTeacher(intid,Stringname){ this.id=id; this.name=name; } publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicList getStudents(){ returnstudents; } publicvoidsetStudents(List students){ this.students=students; } @Override publicStringtoString(){ return"Teacher[id="+id+",name="+name+",mStudents=" +students+"]"; } }
上面的代码比较简单,主要就几个属性,这里值得注意的是,默认的构造函数一定要写,不然是无法解析的。(对于fastjson严格按照JavaBean的规范来,有一点不对就无法解析,这里一定要切记,每一个实体类的属性的get,set方法必须写,切方法第四个字母必须大写,最好使用Eclipse的source->genrealsettersandgetters生成get,set方法,切记,切记)。对于Gson这里就没有这么多的要求了,但最好还是按照JavaBean来写,避免一些位置的错误。
上面主要基本的介绍完了,就开始解析,首先要下载fastjson和Gson的jar包,这个网上很多请自行下载。
首先看fastjson的解析
首先解析一个实体类为json格式。
Studentstudent=newStudent(0,"Aaron",24); System.out.println(JSON.toJSONString(student));
输出结果为:{"age":24,"id":0,"name":"Aaron"}
输出的json格式与我们的Student中定义的属性其实是不一致的,这个其实不影响我们生成以及后面的解析,因为他有严格的get和set方法定义。
更复杂一点的数据类型也可以很方便的使用JSON.toJsonString(Objecto)这个方法进行解析成json格式。
Liststudents=newArrayList (); for(inti=0;i<5;i++){ Studentstu=newStudent(i,"Student"+i,18+i); students.add(stu); }
解析结果为:
[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"},{"age":20,"id":2,"name":"Student2"},{"age":21,"id":3,"name":"Student3"},{"age":22,"id":4,"name":"Student4"}]
我们来看看更复杂一点的结构。 我们将一个Teacher列表来解析,一个Teacher对象中是包含Student列表的这个也在我们常用的数据模型,下面看看代码:
ListteaList=newArrayList (); longtime=System.currentTimeMillis(); for(inti=0;i<10;i++){ Teacherteacher=newTeacher(i,"Teacher"+i); List stus=newArrayList (); for(intj=0;j<4;j++){ Students=newStudent(j,"Student"+j,18+j); stus.add(s); } teacher.setStudents(stus); teaList.add(teacher); } StringjsonTeach=JSON.toJSONString(teaList); System.out.println("fastjson="+jsonTeach);
结果为:
fastjson=[{"id":0,"name":"Teacher0","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]},{"id":1,"name":"Teacher1","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]},{"id":2,"name":"Teacher2","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]},{"id":3,"name":"Teacher3","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]}]
还是一个简单的函数而已,就能办到。
这个还有toJSONString重载的方法,有很多,在给一个就是可以按照标准的json格式输出,上面的输出都不规范,我们来看看,
Studentstudent=newStudent(0,"Aaron",24); System.out.println(JSON.toJSONString(student,true));
输出为:
{ "age":24, "id":0, "name":"Aaron" }
如果我们想要将实体类中的某个字段或某几个不进行解析呢?那么我们可以使用transient关键字,来标记它为不需要的,在fastjson中还提供了一种便捷的方法来自定义我们需要序列化的字段,
SimplePropertyPreFilterfilter=newSimplePropertyPreFilter(实体类.class,"字段1","字段2");字段为我们需要序列化的字段,如果实体类中没有改字段则不解析放弃该字段而不会报错。
如下:
SimplePropertyPreFilterfilter=newSimplePropertyPreFilter(Student.class,"id","age"); StringjsonStu=JSON.toJSONString(students,filter);
这样就只会序列化id和age的字段。
下面进行fastjson的反序列化,这个也是很常用的功能,
还是拿最简单的来进行示范,
Studentstudent=newStudent(0,"Aaron",24); Stringstr=JSON.toJSONString(student,true); System.out.println(JSON.parseObject(str,Student.class));
反序列化主要使用的是JSON.parseObject(str,class);它就能把我们的str转化为class类型的对象,当然还有更复杂的对象,比如:
Liststudents=newArrayList (); for(inti=0;i<5;i++){ Studentstu=newStudent(i,"Student"+i,18+i); students.add(stu); } //过滤哪些属性需要转换 //SimplePropertyPreFilterfilter=newSimplePropertyPreFilter(Student.class,"id","age"); //StringjsonStu=JSON.toJSONString(students,filter); StringjsonStu=JSON.toJSONString(students); System.out.println(jsonStu); List stu=JSON.parseObject(jsonStu,newTypeReference >(){}); for(inti=0;i
前面就是添加数据,然后在后面解析为json格式,然后在转化为类的对象,这里转为List
对象,主要用到newTypeReference<数据返回类型>(){},我们使用的就是newTypeReference >(){}返回的结果就是List
也不需要强制转化,我们看看上面输出的结果为:Student[id=0,name=Student0,age=18] Student[id=1,name=Student1,age=19] Student[id=2,name=Student2,age=20] Student[id=3,name=Student3,age=21] Student[id=4,name=Student4,age=22]当然fastjson能处理的数据类型还有很多很多,我主要列了我常用的数据类型,今天主要就讲到这里。
后面我会将也简单介绍下Gson的基本使用,然后在和fastjson进行对比,看看时间是否真的比gson快6倍。
好久没有写博客了,文采一般,但希望大家能够喜欢,多提意见,一起进步。大家有什么想要了解的也可以留言,我后面慢慢的进行学习,然后进行讲解。
总结
以上所述是小编给大家介绍的Java中FastJson的基本使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!