什麼是fastjson
fastjson是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字符串,支持將Java Bean序列化爲JSON字符串,也可以從JSON字符串發序列化到Java Bean。
fastjson優點
速度快
fastjson相對其他的JSON庫的特點是快,從2011年fastjson1.1x發佈版本之後,其性能從未被其他Java實現的JSON庫超越。
使用廣泛
fastjson在阿里巴巴大規模使用,在數萬臺服務器上部署,fastjson在業界被廣泛接受。在2012年被開運中國評選爲最受歡迎的國產開源軟件之一。
測試完備
fastjson有很多的testcase,在1.2.11版本中,testcase超過3321個。每次發佈都會進行迴歸測試,保證質量穩定。
使用簡單
fastjson的API十分簡潔
String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}",VO.classs); //反序列話
功能完備
支持泛型,支持流處理超大文本,支持枚舉,支持序列化和反序列化擴展。
使用
- maven中央倉庫:http://central.maven.org/maven2/com/alibaba/fastjson/
- 直接配置依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version> x.x.x</version>
</dependency>
API
JSON這個類是fastjson API的入口,主要功能都通過這個類提供
序列化API
package com.alibaba.fastjson;
public abstract class JSON {
// 將Java對象序列化爲JSON字符串,支持各種各種Java基本類型和JavaBean
public static String toJSONString(Object object, SerializerFeature... features);
// 將Java對象序列化爲JSON字符串,返回JSON字符串的utf-8 bytes
public static byte[] toJSONBytes(Object object, SerializerFeature... features);
// 將Java對象序列化爲JSON字符串,寫入到Writer中
public static void writeJSONString(Writer writer,
Object object,
SerializerFeature... features);
// 將Java對象序列化爲JSON字符串,按UTF-8編碼寫入到OutputStream中
public static final int writeJSONString(OutputStream os, //
Object object, //
SerializerFeature... features);
}
JSON字符串反序列化API
package com.alibaba.fastjson;
public abstract class JSON {
// 將JSON字符串反序列化爲JavaBean
public static <T> T parseObject(String jsonStr,
Class<T> clazz,
Feature... features);
// 將JSON字符串反序列化爲JavaBean
public static <T> T parseObject(byte[] jsonBytes, // UTF-8格式的JSON字符串
Class<T> clazz,
Feature... features);
// 將JSON字符串反序列化爲泛型類型的JavaBean
public static <T> T parseObject(String text,
TypeReference<T> type,
Feature... features);
// 將JSON字符串反序列爲JSONObject
public static JSONObject parseObject(String text);
}
DEMO
parse Tree
import com.alibaba.fastjson.*;
JSONObject jsonObj = JSON.parseObject(jsonStr);
parse POJO
import com.alibaba.fastjson.JSON;
Model model = JSON.parseObject(jsonStr, Model.class);
parse POJO Generic
mport com.alibaba.fastjson.JSON;
Type type = new TypeReference<List<Model>>() {}.getType();
List<Model> list = JSON.parseObject(jsonStr, type);
convert POJO to string
import com.alibaba.fastjson.JSON;
Model model = ...;
String jsonStr = JSON.toJSONString(model);
convert POJO to json bytes
import com.alibaba.fastjson.JSON;
Model model = ...;
byte[] jsonBytes = JSON.toJSONBytes(model);
write POJO as json string to OutputStream
import com.alibaba.fastjson.JSON;
Model model = ...;
OutputStream os;
JSON.writeJSONString(os, model);
write POJO as json string to Writer
import com.alibaba.fastjson.JSON;
Model model = ...;
Writer writer = ...;
JSON.writeJSONString(writer, model);
JSONField
介紹
注意:若屬性是私有的,必須有set方法。否則無法序列化
public @interface JSONField {
//配置序列化和反序列化的順序
int ordinal() default 0;
//指定字段的名稱
String name() default "";
//指定字段的格式,對日期格式有用
String format() default "";
//是否序列化
boolean serialize() default true;
//是否反序列化
boolean deserialize() default true;
SerializerFeature[] serialzeFeatures() default {};
Feature[] parseFeatures() default {};
String label() default "";
//當你有一個字段是字符串類類型,裏面是json格式數據,你希望直接輸入,而不是經過轉義之後再輸出
boolean jsonDirect() default false;
//指定屬性的序列化類
Class<?> serializeUsing() default Void.class;
Class<?> deserializeUsing() default Void.class;
//支持反序列化時使用多個不同的字段名稱
String[] alternateNames() default {};
boolean unwrapped() default false;
}
配置方式
JSONField可以配置在字段或者setter/getter方法上。例如:
配置在字段上
public class A{
@JSONField(name="ID")
private int id;
public int getId() {return id;}
public void setId(int value) {this.id = id;}
}
配置在setter/getter上
public class A {
private int id;
@JSONField(name="ID")
public int getId() {return id;}
@JSONField(name="ID")
public void setId(int value) {this.id = id;}
}
使用format配置日期格式化
public class A{
//配置date序列化和反序列化使用yyyyMMdd日期格式
@JSONField(format="yyyyMMdd")
public Date date;
}
使用serialize/deserialize指定字段不序列化
public class A {
@JSONField(serialize=false)
public Date date;
}
public class A {
@JSONField(deserialize=false)
public Date date;
}
使用ordinal指定字段的順序
public static class VO {
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
}
JSONPath
介紹
可以在java框架中當作對象查詢語言使用
API
package com.alibaba.fastjson;
public class JSONPath {
// 求值,靜態方法
public static Object eval(Object rootObject, String path);
// 計算Size,Map非空元素個數,對象非空元素個數,Collection的Size,數組的長度。其他無法求值返回-1
public static int size(Object rootObject, String path);
// 是否包含,path中是否存在對象
public static boolean contains(Object rootObject, String path) { }
// 是否包含,path中是否存在指定值,如果是集合或者數組,在集合中查找value是否存在
public static boolean containsValue(Object rootObject, String path, Object value) { }
// 修改制定路徑的值,如果修改成功,返回true,否則返回false
public static boolean set(Object rootObject, String path, Object value) {}
// 在數組或者集合中添加元素
public static boolean array_add(Object rootObject, String path, Object... values);
}
支持語法
JSONPATH | 描述 |
---|---|
$ | 根對象,例如$.name |
[num] | 數組訪問,其中num是數字,可以是符數。例如$[0].leader.departments[-1].name |
[num0,num1,…] | 數組多個元素訪問,其中num是數字,可以是負數,返回數組中的多個元素。例如$[0,3,-1,4] |
[start:end] | 數組範圍訪問,其中start和end是開始下標和結束下標,可以是負數,返回數組中的多個元素。例如$[0:5] |
[?(key)] | 對象屬性非空過濾,例如$.departs[?(name)] |
[key > 123] | 數值類型對象屬性比較過濾,例如$.departs[id>=123],比較操作符支持=,!=,>,>=,<,<= |
[key like ‘aa%’] | 字符串類型like過濾,例如departs[name like ‘aa(.)*’],通配符只支持%;支持not like |
[key rlike ‘regexpr’] | 字符串類型正則匹配過濾,例如departs[name like ‘aa(.)*’],正則語法爲jdk的正則語法,支持not rlike |
[key between 234 and 456] | BETWEEN過濾, 支持數值類型,支持not between 例如: .departs[id not between 101 and 201] |
length() 或者 size() | 數組長度。例如$.values.size() 支持類型java.util.Map和java.util.Collection和數組 |
. | 屬性訪問,例如$.name |
… | deepScan屬性訪問,例如$…name |
* | 對象的所有屬性,例如$.leader.* |
[‘key’] | 屬性訪問。例如$[‘name’] |
[‘key0’,‘key1’] | 多個屬性訪問。例如$[‘id’,‘name’] |
toString
介紹
toString 將java對象序列化爲JSON字符串,fastjson提供了一個最簡單的入口
package com.alibaba.fastjson;
public abstract class JSON {
public static String toJSONString(Object object);
}
writeJSONString
介紹
Fastjson在1.2.11版中,JSON類新增對OutputStream/Writer直接支持
package com.alibaba.fastjson;
public abstract class JSON {
public static final int writeJSONString(OutputStream os, //
Object object, //
SerializerFeature... features) throws IOException;
public static final int writeJSONString(OutputStream os, //
Charset charset, //
Object object, //
SerializerFeature... features) throws IOException;
public static final int writeJSONString(Writer os, //
Object object, //
SerializerFeature... features) throws IOException;
}
pareObject
介紹
在1.2.11版本中,fastjson新增加了對InputStream的支持
package com.alibaba.fastjson;
public abstract class JSON {
public static <T> T parseObject(InputStream is, //
Type type, //
Feature... features) throws IOException;
public static <T> T parseObject(InputStream is, //
Charset charset, //
Type type, //
Feature... features) throws IOException;
}
Api Stream
Fastjson 當需要處理超大JSON文本時,需要Stream API
序列化
超大數組序列化
如果你的JSON格式是一個巨大的JSON數組,有很多元素,則先調用startArray,然後挨個寫入對象,然後調用endArray
JSONWriter writer = new JSONWriter(new FileWriter("文件位置"));
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("文件位置"));
writer.startObject();
for(int i=0;i<1000*1000;++i){
writer.writeKey("x"+i);
writer.writeVaue(new VO());
}
wirter.endObject();
wirter.close();