阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:
速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson;
功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省;无依赖,能够直接运行在Java SE 5.0以上版本;支持Android;开源 (Apache 2.0)
GitHub源码地址:https://github.com/alibaba/fastjson
Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject public static final T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合 public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。
以上加*的是一些项目中的常用方法。
实战示例
Person.java
public class Person {
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
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;
}
}Test.java
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class TestFastJson {
public static void main(String[] args) {
Person json = new Person(23, "Anson");
List<Person> list = new ArrayList<>();
list.add(json);
list.add(new Person(22, "X-rapido"));
System.out.println("------------ 将集合或者对象序例化成JSON ----------------");
//将集合或者对象序例化成JSON
System.out.println(JSON.toJSON(json));
System.out.println(JSON.toJSON(list));
System.out.println("------------ Json串反序列化成对象 ----------------");
//Json串反序列化成对象
Person person = JSON.parseObject("{\"name\":\"Anson\",\"age\":19}", Person.class);
System.out.printf("name:%s,age:%d\n", person.getName(), person.getAge());
System.out.println("------------ 数组对象反序列化成集合 ---------------");
//数组对象反序列化成集合
String str = "[{\"name\":\"GuoMin\",\"age\":19},{\"name\":\"Anson\",\"age\":12}]";
List<Person> listPerson = JSON.parseArray(str, Person.class);
for (Person item : listPerson) {
System.out.println(item.getName());
System.out.println(item.getAge());
}
System.out.println("------------ 没有对象直接解析JSON对象 ------------");
//没有对象直接解析JSON对象
JSONObject jobj = JSON.parseObject("{\"name\":\"Anson\",\"age\":19}");
System.out.printf("name:%s,age:%d\n", jobj.getString("name"), jobj.getBigInteger("age"));
System.out.println("------------ 没有对象直接解析JSON数组 -------------");
//没有对象直接解析JSON数组
JSONArray jarr = JSON.parseArray("[{\"name\":\"Anson\",\"age\":19},{\"name\":\"GuoMin\",\"age\":12}]");
for (int i = 0, len = jarr.size(); i < len; i++) {
JSONObject temp = jarr.getJSONObject(i);
System.out.printf("name:%s,age:%d\n", temp.getString("name"), temp.getBigInteger("age"));
}
for (Object obj : jarr) {
System.out.println(obj.toString());
}
}
}输出结果
------------ 将集合或者对象序例化成JSON ----------------
{"name":"Anson","age":23}
[{"name":"Anson","age":23},{"name":"X-rapido","age":22}]
------------ Json串反序列化成对象 ----------------
name:Anson,age:19
------------ 数组对象反序列化成集合 ---------------
GuoMin
19
Anson
12
------------ 没有对象直接解析JSON对象 ------------
name:Anson,age:19
------------ 没有对象直接解析JSON数组 -------------
name:Anson,age:19
name:GuoMin,age:12
{"name":"Anson","age":19}
{"name":"GuoMin","age":12}处理较大JSON文本
当需要处理超大JSON文本时,需要Stream API,在fastjson-1.1.32版本中开始提供Stream API。
超大JSON数组序列化
如果你的JSON格式是一个巨大的JSON数组,有很多元素,则先调用startArray,然后挨个写入对象,然后调用endArray。
JSONWriter writer = new JSONWriter(new FileWriter("/tmp/huge.json"));
writer.startArray();
for (int i = 0; i < 1000 * 1000; ++i) {
writer.writeValue(new VO());
}
writer.endArray();
writer.close();超大JSON对象序列化
如果你的JSON格式是一个巨大的JSONObject,有很多Key/Value对,则先调用startObject,然后挨个写入Key和Value,然后调用endObject。
JSONWriter writer = new JSONWriter(new FileWriter("/tmp/huge.json"));
writer.startObject();
for (int i = 0; i < 1000 * 1000; ++i) {
writer.writeKey("x" + i);
writer.writeValue(new VO());
}
writer.endObject();
writer.close();反序列化
例3
JSONReader reader = new JSONReader(new FileReader("/tmp/huge.json"));
reader.startArray();
while(reader.hasNext()) {
VO vo = reader.readObject(VO.class);
// handle vo ...
}
reader.endArray();
reader.close();例4
JSONReader reader = new JSONReader(new FileReader("/tmp/huge.json"));
reader.startObject();
while(reader.hasNext()) {
String key = reader.readString();
VO vo = reader.readObject(VO.class);
// handle vo ...
}
reader.endObject();
reader.close();相关参考
Git文档:https://github.com/alibaba/fastjson/wiki/使用指南 留意右边的pages,有很多中文教程
未经允许请勿转载:程序喵 » 阿里巴巴FastJson —— Java高性能JSON开发包
程序喵