工具類-Fastjson入門使用
- 2020 年 9 月 15 日
- 筆記
簡介
什麼是Fastjson?
fastjson是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字元串,支援將Java Bean序列化為JSON字元串,也可以從JSON字元串反序列化到JavaBean。
Fastjson是一個Java語言編寫的高性能功能完善的JSON庫。它採用一種「假定有序快速匹配」的演算法,把JSON Parse的性能提升到極致,是目前Java語言中最快的JSON庫。Fastjson介面簡單易用,已經被廣泛使用在快取序列化、協議交互、Web輸出、Android客戶端等多種應用場景。
主要特點:
快速FAST (比其它任何基於Java的解析器和生成器更快,包括jackson)
強大(支援普通JDK類包括任意Java Bean Class、Collection、Map、Date或enum)
零依賴(沒有依賴其它任何類庫除了JDK)
開源,使用Apache License 2.0協議開源。
源碼://github.com/alibaba/fastjson
wiki://github.com/alibaba/fastjson/wiki/Quick-Start-CN
Fastjson使用場景
fastjson已經被廣泛使用在各種場景,包括cache存儲、RPC通訊、MQ通訊、網路協議通訊、Android客戶端、Ajax伺服器處理程式等等。
Fastjson的優點
- 速度快
fastjson相對其他JSON庫的特點是快,從2011年fastjson發布1.1.x版本之後,其性能從未被其他Java實現的JSON庫超越。 - 使用廣泛
fastjson在阿里巴巴大規模使用,在數萬台伺服器上部署,fastjson在業界被廣泛接受。在2012年被開源中國評選為最受歡迎的國產開源軟體之一。 - 測試完備
fastjson有非常多的testcase,在1.2.11版本中,testcase超過3321個。每次發布都會進行回歸測試,保證品質穩定。 - 使用簡單
fastjson的API十分簡潔。
String text = JSON.toJSONString(obj); //序列化
Model vo = JSON.parseObject("{...}", Mpode.class); //反序列化
- 功能完備
支援泛型,支援流處理超大文本,支援枚舉,支援序列化和反序列化擴展。
下載和使用
下載
你可以在maven中央倉庫中直接下載:
//repo1.maven.org/maven2/com/alibaba/fastjson/
或者配置maven依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>x.x.x</version>
</dependency>
其中x.x.x是版本號,跟進需要使用特定版本,建議使用最新版本,目前最新版本為1.2.58
簡單使用
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);
}
簡單示例
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
import com.alibaba.fastjson.JSON;
Type type = new TypeReference<List<Model>>() {}.getType();
List<Model> list = JSON.parseObject(jsonStr, type);
convert POJO to json 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);
高級使用
Fastjson 訂製序列化
- 簡介
fastjson支援多種方式訂製序列化。
通過@JSONField訂製序列化
通過@JSONType訂製序列化
通過SerializeFilter訂製序列化
通過ParseProcess訂製反序列化
- 使用@JSONField配置
可以把@JSONField配置在欄位或者getter/setter方法上。例如:
public class VO {
@JSONField(name="ID")
private int id;
}
或者
public class VO {
private int id;
@JSONField(name="ID")
public int getId() { return id;}
@JSONField(name="ID")
public void setId(int value) {this.id = id;}
}
- 使用@JSONType配置
和JSONField類似,但JSONType配置在類上,而不是field或者getter/setter方法上。 - 通過SerializeFilter訂製序列化
通過SerializeFilter可以使用擴展編程的方式實現訂製序列化。fastjson提供了多種SerializeFilter:
- PropertyPreFilter 根據PropertyName判斷是否序列化
- PropertyFilter 根據PropertyName和PropertyValue來判斷是否序列化
- NameFilter 修改Key,如果需要修改Key,process返回值則可
- ValueFilter 修改Value
- BeforeFilter 序列化時在最前添加內容
*AfterFilter 序列化時在最後添加內容
以上的SerializeFilter在JSON.toJSONString中可以使用。
SerializeFilter filter = ...; // 可以是上面5個SerializeFilter的任意一種。
JSON.toJSONString(obj, filter);
- 通過ParseProcess訂製反序列化
Fastjson 實例
Fastjson 對象或數組轉JSON
Fastjson阿里巴巴工程師開源的一個 json 庫:Fastjson,這個庫在解析速度和易用性上來說都很不錯。
在日誌解析,前後端數據傳輸交互中,經常會遇到String與map、json、xml等格式相互轉換與解析的場景,其中json基本成為了跨語言、跨前後端的事實上的標準數據交互格式。應該來說各個語言中解析json的庫都一大片(具體 json 格式與三方庫的介紹請見://www.json.org/json-zh.html ),比如python都集成在了內置庫中,成為標準API,今天我們要聊的是java中如何方便的使用json格式。
下面一個示例是如何使用Fastjson 把對象或數組轉JSON
package com.ohaotian.feifz.style.study.utils;
/**
* @author feifz
* @version 1.0.0
* @Description alibaba fastjson工具類
* @createTime 2019年06月10日 11:45:00
*/
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
class FastJsonTest {
public static void main(String[] args) {
// 構建用戶geust
User guestUser = new User();
guestUser.setName("guest");
guestUser.setAge(28);
// 構建用戶root
User rootUser = new User();
rootUser.setName("root");
guestUser.setAge(35);
// 構建用戶組對象
UserGroup group = new UserGroup();
group.setName("admin");
group.getUsers().add(guestUser);
group.getUsers().add(rootUser);
// 用戶組對象轉JSON串
String jsonString = JSON.toJSONString(group);
System.out.println("jsonString:" + jsonString);
// JSON串轉用戶組對象
UserGroup group2 = JSON.parseObject(jsonString, UserGroup.class);
System.out.println("group2:" + group2);
// 構建用戶對象數組
User[] users = new User[2];
users[0] = guestUser;
users[1] = rootUser;
// 用戶對象數組轉JSON串
String jsonString2 = JSON.toJSONString(users);
System.out.println("jsonString2:" + jsonString2);
// JSON串轉用戶對象列表
List<User> users2 = JSON.parseArray(jsonString2, User.class);
System.out.println("users2:" + users2);
}
}
@Data
class User {
private String name;
private int age;
}
@Data
class UserGroup {
private String name;
private List<User> users = new ArrayList<>();
}
輸出結果:
jsonString:{"name":"admin","users":[{"age":35,"name":"guest"},{"age":0,"name":"root"}]}
group2:UserGroup [name=admin, users=[User [name=guest, age=35], User [name=root, age=0]]]
jsonString2:[{"age":35,"name":"guest"},{"age":0,"name":"root"}]
users2:[User [name=guest, age=35], User [name=root, age=0]]
fastjson通過各方面測試都很好,功能性能都是No.1,喜歡,它的源程式碼品質很高,作者也煞費苦心,將性能做到了最好,全面超越其他的json類庫。
通過fastjson我們可以快速進行開發。
Fastjson Obejct/Map/JSON/String 互轉
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> T parseObject(String text, Class<T> clazz); // 把JSON文本parse為JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> 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。
有關類庫的一些說明
SerializeWriter:相當於StringBuffer
JSONArray:相當於List<Object>
JSONObject:相當於Map<String, Object>
JSON反序列化沒有真正數組,本質類型都是List<Object>
示例程式碼
package com.ohaotian.feifz.style.study.utils;
/**
* @author feifz
* @version 1.0.0
* @Description fastjson 高級應用
* @createTime 2019年06月10日 15:43:00
*/
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import lombok.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
* @author feifz
* @version 1.0.0
* @Description alibaba fastjson高級應用
* @createTime 2019年06月10日 11:45:00
*/
public class FastjsonTest {
private static SerializeConfig mapping = new SerializeConfig();
static {
mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
}
public static void main(String[] args) {
Date date = new Date();
String text = JSON.toJSONString(date, mapping);
System.out.println(text);
}
public static void json2List() {
/**List -> JSON array*/
List<Bar> barList = new ArrayList<Bar>();
barList.add(new Bar());
barList.add(new Bar());
barList.add(new Bar());
String json = JSON.toJSONString(barList);
System.out.println(json);
json = JSON.toJSONString(barList, true);
System.out.println(json);
/**JSON array -> List*/
List<Bar> barList1 = JSON.parseArray(json, Bar.class);
for (Bar bar : barList1) {
System.out.println(bar.toString());
}
}
public static void json2Map() {
//Map -> JSON
Map<String, Bar> map = new HashMap<String, Bar>();
map.put("a", new Bar());
map.put("b", new Bar());
map.put("c", new Bar());
String json = JSON.toJSONString(map, true);
System.out.println(json);
//JSON -> Map
Map<String, Bar> map1 = (Map<String, Bar>) JSON.parse(json);
for (String key : map1.keySet()) {
System.out.println(key + ":" + map1.get(key));
}
}
public static void array2JSON() {
String[] arr_String = {"a", "b", "c"};
String json_arr_String = JSON.toJSONString(arr_String, true);
System.out.println(json_arr_String);
JSONArray jsonArray = JSON.parseArray(json_arr_String);
for (Object o : jsonArray) {
System.out.println(o);
}
System.out.println(jsonArray);
}
public static void array2JSON2() {
Bar[] arr_Bar = {new Bar(), new Bar(), new Bar()};
String json_arr_Bar = JSON.toJSONString(arr_Bar, true);
System.out.println(json_arr_Bar);
JSONArray jsonArray = JSON.parseArray(json_arr_Bar);
for (Object o : jsonArray) {
System.out.println(o);
}
System.out.println(jsonArray);
}
public static void map2JSON() {
Map map = new HashMap();
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
String json = JSON.toJSONString(map);
System.out.println(json);
Map map1 = JSON.parseObject(json);
for (Object o : map.entrySet()) {
Map.Entry<String, String> entry = (Map.Entry<String, String>) o;
System.out.println(entry.getKey() + "--->" + entry.getValue());
}
}
}
@Data
class Bar {
public static SerializeConfig mapping = new SerializeConfig();
private String barName;
private int barAge;
private Date barDate = new Date();
static {
mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd"));
}
{
Random r = new Random();
barName = "sss_" + String.valueOf(r.nextFloat());
barAge = r.nextInt();
}
public static void main(String[] args) {
String x1 = JSON.toJSONString(new Bar(), true);
System.out.println(x1);
String x2 = JSON.toJSONString(new Bar(), mapping);
System.out.println(x2);
}
}
Fastjson API
- Fastjson JSONField
- Fastjson JSONPath
- Fastjson toJSONString
- Fastjson writeJSONString
- Fastjson parseObject
- Fastjson Api Compare
- Fastjson API Stream
- Fastjson API ParseProcess
- Fastjson API SerializeFilter
Fastjson 常見問題
參考
結語
歡迎關注微信公眾號『碼仔zonE』,專註於分享Java、雲計算相關內容,包括SpringBoot、SpringCloud、微服務、Docker、Kubernetes、Python等領域相關技術乾貨,期待與您相遇!