阿里巴巴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,有很多中文教程