阿里巴巴FastJson —— Java高性能JSON开发包

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


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏