一、FastJson概述
FastJson是一個Java語言編寫的高性能JSON解析器和生成器,由阿里巴巴公司開發和維護,已經成為了Java開發中廣泛使用的JSON解析工具之一。FastJson在解析JSON字元串時,具有解析速度快,易用性高,內存佔用低等優勢,同時還支持廣泛的Java數據類型轉換和泛型解析。
二、基本使用
FastJson支持從String、InputStream、Reader和Byte[]等多種數據源讀取JSON數據,並能夠將JSON數據轉化為Java對象或者JavaBean。 下面是一個基本的FastJson使用示例:
public class User {
private String name;
private int age;
// getter and setter
}
// 將Java對象轉換為JSON字元串
User user = new User();
user.setName("Tom");
user.setAge(22);
String jsonString = JSON.toJSONString(user);
// 將JSON字元串轉換為Java對象
User user2 = JSON.parseObject(jsonString, User.class);
// 將JSON字元串轉換為JavaBean
JSONObject jsonObject = JSON.parseObject(jsonString);
User user3 = jsonObject.toJavaObject(User.class);
三、JSON序列化和反序列化
FastJson支持Java對象與JSON字元串之間的序列化和反序列化,即將Java對象轉化成JSON字元串,以及將JSON字元串轉為Java對象。
1. 序列化
序列化是指將Java對象轉化為JSON字元串。
(1) Java對象轉為JSON字元串
User user = new User(); user.setName("Tom"); user.setAge(22); // 將java對象轉換為json字元串 String jsonString = JSON.toJSONString(user);
(2) 數組轉換為JSON字元串
String[] strArray = {"a", "b", "c"}; // 將數組轉換為json數組字元串 String jsonArrayStr = JSONArray.toJSONString(strArray);
(3) List轉換為JSON字元串
List userList = new ArrayList(); User user1 = new User(); user1.setName("Tom"); user1.setAge(22); userList.add(user1); User user2 = new User(); user2.setName("John"); user2.setAge(33); userList.add(user2); // 將List轉換為json數組字元串 String jsonArrayStr = JSONArray.toJSONString(userList);
2. 反序列化
反序列化是將JSON字元串轉為Java對象。
(1) JSON字元串轉Java對象
String jsonString = "{\"name\":\"Tom\", \"age\":22}";
// 將json字元串轉換為java對象
User user = JSON.parseObject(jsonString, User.class);
(2) JSON字元串轉List
String jsonArrayStr = "[{\"name\":\"Tom\", \"age\":22},{\"name\":\"John\", \"age\":33}]";
// 將json數組字元串轉換為List
List userList = JSONArray.parseArray(jsonArrayStr, User.class);
四、防止Java對象循環引用
FastJson支持防止Java對象循環引用,當Java對象中存在循環引用時,可以通過設置SerializerFeature.DisableCircularReferenceDetect禁用循環引用檢測。
User userA = new User();
User userB = new User();
userA.setName("Tom");
userA.setAge(22);
userB.setName("John");
userB.setAge(33);
userA.setFriend(userB);
userB.setFriend(userA);
// 將java對象轉換為json字元串(禁用循環引用檢測)
String jsonString = JSON.toJSONString(userA, SerializerFeature.DisableCircularReferenceDetect);
五、JavaBean序列化與反序列化
FastJson提供了將JavaBean對象直接序列化成JSON字元串以及將JSON字元串轉換為JavaBean對象的方法。
1. JavaBean轉換成JSON字元串
可以使用 JSON.toJSONString(Object obj) 方法將JavaBean轉換為JSON字元串。
User user = new User();
user.setName("Tom");
user.setAge(22);
// 將JavaBean對象轉換為JSON字元串
String jsonString = JSON.toJSONString(user);
2. JSON字元串轉換成JavaBean
可以使用 JSON.parseObject(String text, Class clazz) 方法將JSON字元串轉換為JavaBean對象。
String jsonString = "{\"name\":\"Tom\", \"age\":22}";
// 將JSON字元串轉換為Java對象
User user = JSON.parseObject(jsonString, User.class);
3. 嵌套的JavaBean對象
支持將嵌套的JavaBean對象直接轉換成JSON字元串,以及將JSON字元串轉換成嵌套的JavaBean對象。
public class Group {
private int groupId;
private String groupName;
private List userList;
// getter and setter
}
User user1 = new User();
user1.setName("Tom");
user1.setAge(22);
User user2 = new User();
user2.setName("John");
user2.setAge(33);
List userList = new ArrayList();
userList.add(user1);
userList.add(user2);
Group group = new Group();
group.setGroupId(111);
group.setGroupName("test group");
group.setUserList(userList);
// 將自定義JavaBean對象轉換為JSON字元串
String jsonString = JSON.toJSONString(group);
// 將JSON字元串轉換為自定義JavaBean對象
Group group2 = JSON.parseObject(jsonString, Group.class);
六、JSON字元串格式化
FastJson提供了美化輸出的方法,便於調試和查看。
User user = new User();
user.setName("Tom");
user.setAge(22);
String jsonString = JSON.toJSONString(user, SerializerFeature.PrettyFormat);
七、FastJson性能優化
FastJson是一個高性能的JSON解析器,在解析JSON字元串時具有較高的運行速度和卓越的內存管理能力。下面列舉了幾個性能優化的方法:
1. 關閉對象到JSON字元串的轉換
當你的JavaBean不需要轉換成JSON字元串時,可以關閉該轉換以提高性能。
User user = new User();
user.setName("Tom");
user.setAge(22);
// 將Java對象轉換成JSON字元串(關閉JavaBean對json字元串的序列化)
String jsonString = JSON.toJSONString(user, SerializerFeature.DisableCircularReferenceDetect);
2. 使用stream API處理大量JSON數據
FastJson提供了stream API來處理大量的JSON數據,以減少內存和提高性能。
JSONReader reader = new JSONReader(new FileReader("data.json"));
reader.startArray();
while (reader.hasNext()) {
User user = reader.readObject(User.class);
// do something with user
}
reader.endArray();
reader.close();
八、FastJson配置
FastJson提供了一些配置項,可以通過設置這些配置項來調整FastJson的行為。下面列舉了一些常見的配置項:
1. 更改日期格式
FastJson默認使用ISO-8601格式來序列化日期,可以通過設置SerializerFeature.WriteDateUseDateFormat配置項來更改日期格式。
User user = new User();
user.setName("Tom");
user.setAge(22);
user.setBirthDate(new Date());
// 將Java對象轉換為JSON字元串(設置日期格式)
String jsonString = JSON.toJSONStringWithDateFormat(user, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteDateUseDateFormat);
2. 序列化Map時排序
默認情況下,FastJson不保證序列化Map時保持任何順序,可以通過設置SerializerFeature.MapSortField配置項來按照key進行排序。
Map map = new LinkedHashMap();
map.put("b", "valB");
map.put("d", "valD");
map.put("a", "valA");
map.put("c", "valC");
// 將Map轉換為json字元串(按key排序)
String jsonString = JSON.toJSONString(map, SerializerFeature.MapSortField);
3. Enum序列化時使用名稱
默認情況下,FastJson將Java Enum類型序列化為數字,可以通過設置SerializerFeature.WriteEnumUsingName配置項將Enum類型序列化為名稱。
public enum Gender {
MALE, FEMALE
}
public class User {
private String name;
private Gender gender;
// getter and setter
}
User user = new User();
user.setName("Tom");
user.setGender(Gender.MALE);
// 將Java對象轉換為JSON字元串(使用枚舉名稱)
String jsonString = JSON.toJSONString(user, SerializerFeature.WriteEnumUsingName);
九、FastJson異常處理
FastJson在解析JSON字元串時可能會拋出JsonFormatException等異常,可以通過try-catch語句來捕獲這些異常並進行處理。
String jsonString = "{\"name\":\"Tom\", \"age\":22, \"birthDate\":\"2020-01-01\"}";
try {
User user = JSON.parseObject(jsonString, User.class);
} catch (JSONException e) {
// 處理異常
System.out.println("JSON解析異常:" + e.getMessage());
}
總結
FastJson是一個高性能的Java JSON解析器和生成器,具有解析速度快、易用性高、內存佔用低等優勢。本文主要對FastJson的使用進行了詳細的介紹,包括基本使用、JSON序列化與反序列化、防止Java對象循環引用、JavaBean序列化與反序列化、JSON字元串格式化、性能優化、配置和異常處理等方面。掌握了這些知識,可以更加高效地使用FastJson進行JSON數據處理。
原創文章,作者:VCJTY,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/369471.html