pom.xml文件中加入依赖依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency>
首先建立两个实体类,Student.Java和 Teacher.java
Student.java 和Teacher.java 的代码如下:
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+"]"; } }
importjava.util.List; publicclassTeacher{ privateintid; privateStringname; privateList<Student>students; /** *默认的构造方法必须不能省,不然不能解析 */ 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<Student>getStudents(){ returnstudents; } publicvoidsetStudents(List<Student>students){ this.students=students; } @Override publicStringtoString(){ return"Teacher[id="+id+",mStudents=" +students+"]"; } }
上面 的代码比较简单,主要就几个属性,这里值得注意的是, 默认的构造函数一定要写,不然是无法解析的。(对于fastjson 严格按照JavaBean的规范来,有一点不对就无法解析,这里一定要切记,每一个实体类的属性的get,set 方法必须写,切方法第四个字母必须大写,最好使用Eclipse的source->genreal setters and getters 生成get,set 方法,切记,切记 )。对于Gson 这里就没有这么多的要求了,但最好还是按照JavaBean来写,避免一些位置的错误。
首先看 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(Object o) 这个方法进行解析成json格式。
List<Student>students=newArrayList<Student>(); for(inti=0;i<5;i++){ Studentstu=newStudent(i,"Student"+i,18+i); students.add(stu); }
解析结果为:
[{"age":18,"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 列表的这个也在我们常用的数据模型,下面看看代码:
List<Teacher>teaList=newArrayList<Teacher>(); longtime=System.currentTimeMillis(); for(inti=0;i<10;i++){ Teacherteacher=newTeacher(i,"Teacher"+i); List<Student>stus=newArrayList<Student>(); 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,"name":"Student1"}]},{"id":1,"name":"Teacher1",{"id":2,"name":"Teacher2",{"id":3,"name":"Teacher3","name":"Student1"}]}]
还是一个简单的函数而已,就能办到。
这个还有toJSONString重载的方法,有很多,在给一个就是可以按照标准的json格式输出,上面的输出都不规范,我们来看看。
Studentstudent=newStudent(0,24); System.out.println(JSON.toJSONString(student,true)); 输出为: { "age":24,"name":"Aaron" }
如果我们想要将实体类中的某个字段或某几个不进行解析呢?那么我们可以使用transient 关键字,来标记它为不需要的,在fastjson中还提供了一种便捷的方法来自定义我们需要序列化的字段,
SimplePropertyPreFilterfilter=newSimplePropertyPreFilter(实体类.class,"字段1","字段2");字段为我们需要序列化的字段,如果实体类中没有改字段则不解析放弃该字段而不会报错。
如下:
SimplePropertyPreFilterfilter=newSimplePropertyPreFilter(Student.class,"id","age"); StringjsonStu=JSON.toJSONString(students,filter);
下面进行fastjson 的反序列化,这个也是很常用的功能,
还是拿最简单的来进行示范,
Studentstudent=newStudent(0,24); Stringstr=JSON.toJSONString(student,true); System.out.println(JSON.parSEObject(str,Student.class));
反序列化主要使用的是JSON.parSEObject(str,class); 它就能把我们的str 转化为class 类型的对象,当然还有更复杂的对象,比如:
List<Student>students=newArrayList<Student>(); for(inti=0;i<5;i++){ Studentstu=newStudent(i,18+i); students.add(stu); } //过滤哪些属性需要转换 //SimplePropertyPreFilterfilter=newSimplePropertyPreFilter(Student.class,"age"); //StringjsonStu=JSON.toJSONString(students,filter); StringjsonStu=JSON.toJSONString(students); System.out.println(jsonStu); List<Student>stu=JSON.parSEObject(jsonStu,newTypeReference<List<Student>>(){}); for(inti=0;i<stu.size();i++) { System.out.println(stu.get(i)); }
前面就是添加数据,然后在后面解析为json格式,然后在转化为类的对象,这里转为List<Student> 对象,主要用到new TypeReference<数据返回类型> (){},我们使用的就是new TypeReference<List<Student>>(){} 返回的结果就是List<Student> 也不需要强制转化,我们看看上面输出的结果为:
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对时间的操作:
Datedate=newDate(); //输出毫秒值 System.out.println(JSON.toJSONString(date)); //默认格式为yyyy-MM-ddHH:mm:ss System.out.println(JSON.toJSONString(date,SerializerFeature.WriteDateUseDateFormat)); //根据自定义格式输出日期 System.out.println(JSON.toJSONStringWithDateFormat(date,"yyyy-MM-dd",SerializerFeature.WriteDateUseDateFormat));
输出结果:
1476085821568 "2016-10-1015:50:21" "2016-10-10"原文链接:https://www.f2er.com/json/289164.html