一:fastjson的介绍
Fastjson是一个Java语言编写的JSON处理器。
1、遵循http://json.org标准,为其官方网站收录的参考实现之一。
2、功能qiang打,支持JDK的各种类型,包括基本的JavaBean、Collection、Map、Date、Enum、泛型。
3、无依赖,不需要例外额外的jar,能够直接跑在JDK上。
4、开源,使用Apache License 2.0协议开源。http://code.alibabatech.com/wiki/display/FastJSON/Home
三:常用方法介绍
Fastjson最主要的使用入口是com.alibaba.fastjson.JSON,下面通过示例代码来慢慢了解方法的使用,以下是示例中用到的实例:
Student.java示例代码:
public class Student { private String name; private int age; public Student() { } public Student(String name,int age){ this.name = name; this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }Grade.java示例代码:
import java.util.ArrayList; import java.util.List; public class Grade { private String gradeName; private List<Student> students = new ArrayList<>(); public Grade() { } public Grade(String gradeName) { this.gradeName = gradeName; } public String getGradeName() { return gradeName; } public void setGradeName(String gradeName) { this.gradeName = gradeName; } public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } }上面的示例代码比较简单,尤其注意的是,默认的构造方法必须要写,不然是无法解析的。由于fastjson 严格按照JavaBean的规范来,有一点不对就无法解析,每一个实体类的属性的get,set 方法必须写,且方法第四个字母必须大写,最好使用开发工具AndroidStudio或者Eclipse的系统方法生成get、set方法。
下面首先来把JavaBean对象序列化为json格式的字符串,
Student student = new Student("dandy",27); String jsonStudent = JSON.toJSONString(student); System.out.println(jsonStudent);输出结果:{"age":27,"name":"dandy"}从结果看出,输出的json格式字符串字段顺序与我们的定义顺序不一致,这个不影响我们的解析。我们看一个复杂点的结构,就是一个年级grade中会有很多学生,即一个年级中包含一个Student类型的List数组,示例代码Grade grade = new Grade("高一"); grade.getStudents().add(new Student("dandy",27)); grade.getStudents().add(new Student("Tabolt",28)); String jsonGrade = JSON.toJSONString(grade); System.out.println(jsonGrade);输出结果:{"gradeName":"高一","students":[{"age":27,"name":"dandy"},{"age":28,"name":"Tabolt"}]}咋一看,此方法输出的json格式字符串不规范,不用着急,这个方法还有很多的重载方法,下面来一个规范的json格式输出,
Student student = new Student("dandy",27); String jsonStudent = JSON.toJSONString(student,true); System.out.println(jsonStudent);输出结果: { "age":27,"name":"dandy" }这下看的比较明白清楚了,但是,如果一个对象中的字段很多,而有些字段不需要被序列化的咋办呢?不用急,有一个便捷的重载方法是可以通过过滤的来具体实现哪些字段的序列化,下面我只想打印student中name字段,示例代码如下:
Student student = new Student("dandy",27); SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Student.class,"name"); String jsonStudent = JSON.toJSONString(student,filter); System.out.println(jsonStudent);输出结果:{"name":"dandy"}很简单的一个操作,就是生成SimplePropertyPreFilter的示例,在构造方法中传入class<?>,以及需要打印的字段名,格式如下:
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(实体类.class,"字段一","字段二");下面来说一下另一个通用的方法,就是反序列化,把json格式的字符串转换成JaveBean对象。
下面先在Student.jav中添加toString方法@Override public String toString() { return "Student [name=" + name + ",age=" + age + "]"; }示例代码如下:
String json = JSON.toJSONString(new Student("Tabolt",28)); Student student = JSON.parSEObject(json,Student.class); System.out.println(student.toString());输出结果:Student [name=Tabolt,age=28]反序列的目的就是把json格式的字符串转成我们需要的class对象,下面来看一个复杂点的,转成List数组形式List<Student> students = new ArrayList<>(); for(int i = 0;i < 5;i++){ Student student = new Student("dandy_"+i,26+i); students.add(student); } String json = JSON.toJSONString(students); List<Student> stus = JSON.parSEObject(json,new TypeReference<List<Student>>(){}); for(Student student:stus){ System.out.println(student.toString()); }代码很简单,就是先生成一个student数组,然后获取数组序列化的json格式的字符串,最后再反序列化得到student数组
输出结果: Student [name=dandy_0,age=26] Student [name=dandy_1,age=27] Student [name=dandy_2,age=28] Student [name=dandy_3,age=29] Student [name=dandy_4,age=30]要实现以上方法,还有一种方法,就是parseArray,只需要稍微改一下就可,
原文链接:https://www.f2er.com/json/289359.htmlList<Student> stus = JSON.parseArray(json,Student.class);输出结果同上。以上就是基本的使用方法了,也是经常用到的。