一、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数据处理。