一、fastjson简介
fastjson是一个高性能的Java JSON解析器,由阿里巴巴开发,已经成为Github上最流行的Java JSON解析库之一,也是阿里巴巴Android开发标准中JSON解析的首选库。 Fastjson支持普通JavaBean(包括内部类、泛型等)序列化和反序列化,支持数组和集合的序列化和反序列化,并支持自定义序列化、反序列化处理器和类型转换。
<!-- Fastjson的引入方式 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
二、fastjson的使用
1. 序列化
序列化是将Java对象转换成JSON格式字符串的过程。Fastjson的序列化非常简单:
// Bean对象
public class User {
private Long id;
private String name;
private int age;
// 省略getter和setter
}
// 序列化
User user = new User();
user.setId(1L);
user.setName("张三");
user.setAge(25);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);
输出结果:
{"age":25,"id":1,"name":"张三"}
2. 反序列化
反序列化是将JSON格式字符串转换成Java对象的过程。Fastjson同样支持反序列化:
// 反序列化
String jsonString = "{\"age\":25,\"id\":1,\"name\":\"张三\"}";
User user = JSON.parseObject(jsonString, User.class);
System.out.println(user.getName());
输出结果:
张三
3. 处理日期类型
Fastjson处理日期类型非常方便,只需要在序列化与反序列化时传入日期格式即可:
// 处理日期类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String format = sdf.format(date);
String jsonString = JSON.toJSONString(date, SerializerFeature.WriteDateUseDateFormat);
System.out.println(jsonString);
Date parse = JSON.parseObject("\"" + format + "\"", Date.class);
System.out.println(parse);
输出结果:
"2022-10-18 13:38:14"
Tue Oct 18 13:38:14 CST 2022
4. 处理枚举类型
Fastjson也能够处理Java中的枚举类型,只需要将枚举对象转换成其对应的字符串即可:
// 处理枚举类型
public enum ResultCode {
SUCCESS(0, "成功"),
FAIL(1, "失败");
private Integer code;
private String message;
ResultCode(Integer code, String message) {
this.code = code;
this.message = message;
}
// 省略getter和setter
}
ResultCode code = ResultCode.SUCCESS;
String jsonString = JSON.toJSONString(code);
System.out.println(jsonString);
String parse = JSON.parseObject("\"SUCCESS\"", String.class);
System.out.println(parse);
输出结果:
"SUCCESS"
SUCCESS
5. 处理嵌套对象
Fastjson支持序列化与反序列化的对象中包含嵌套对象:
// 处理嵌套对象
public class Student {
private Long id;
private String name;
private int age;
public class ClassRoom {
private String name;
private int grade;
// 省略getter和setter
}
private ClassRoom classRoom;
// 省略getter和setter
}
Student student = new Student();
student.setId(1L);
student.setName("张三");
student.setAge(25);
Student.ClassRoom classRoom = student.new ClassRoom();
classRoom.setName("一年级一班");
classRoom.setGrade(1);
student.setClassRoom(classRoom);
String jsonString = JSON.toJSONString(student);
System.out.println(jsonString);
Student parse = JSON.parseObject(jsonString, Student.class);
System.out.println(parse.getClassRoom().getName());
输出结果:
{"age":25,"classRoom":{"grade":1,"name":"一年级一班"},"id":1,"name":"张三"}
一年级一班
6. 处理Map
Fastjson对于Map类型有着很好的处理支持,可以序列化与反序列化不同类型的Map:
// 处理Map
Map<String, String> map = new HashMap<>();
map.put("name", "张三");
map.put("age", "25");
String jsonString = JSON.toJSONString(map);
System.out.println(jsonString);
Map<String, String> parse = JSON.parseObject(jsonString, new TypeReference<Map<String, String>>() {});
System.out.println(parse.get("name"));
输出结果:
{"age":"25","name":"张三"}
张三
三、fastjson高级用法
1. 自定义反序列化
Fastjson允许我们自定义反序列化处理器,以方便针对不同的数据格式进行处理。
// 自定义反序列化
public class DateDeserializer implements ObjectDeserializer {
@Override
public Date deserialze(DefaultJSONParser defaultJSONParser, Type type, Object o) throws ParseException {
String value = defaultJSONParser.getLexer().stringValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.parse(value);
}
@Override
public int getFastMatchToken() {
return 0;
}
}
DeserializeConfig config = new DeserializeConfig();
config.put(Date.class, new DateDeserializer());
JSONObject jsonObject = new JSONObject();
Date date = new Date();
jsonObject.put("date", date);
String jsonString = jsonObject.toJSONString();
System.out.println(jsonString);
JSONObject parse = JSON.parseObject(jsonString);
Date date1 = parse.getObject("date", Date.class);
System.out.println(date1);
输出结果:
{"date":"2022-10-18 14:34:38"}
Mon Oct 18 14:34:38 CST 2022
2. 自定义序列化
Fastjson同样支持自定义序列化处理器,针对不同的数据格式进行处理。
// 自定义序列化
public class DateSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException {
SerializeWriter writer = jsonSerializer.getWriter();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(o);
writer.writeString(format);
}
}
SerializeConfig config = new SerializeConfig();
config.put(Date.class, new DateSerializer());
JSONObject jsonObject = new JSONObject();
Date date = new Date();
jsonObject.put("date", date);
String jsonString = JSON.toJSONString(jsonObject, config);
System.out.println(jsonString);
输出结果:
{"date":"2022-10-18 14:50:03"}
3. 类型转换器
Fastjson允许我们使用类型转换器,进行复杂类型的转换。
// 类型转换器
public class TypeConverter implements ParserConfig.TypeConverter {
@Override
public <T> T convert(Object value, Class<T> clazz) {
if (clazz.equals(Student.class)) {
Student student = new Student();
JSONObject jsonObject = (JSONObject) value;
student.setId(jsonObject.getLong("id"));
student.setName(jsonObject.getString("name"));
student.setAge(jsonObject.getInteger("age"));
Student.ClassRoom classRoom = student.new ClassRoom();
JSONObject classRoomObject = jsonObject.getJSONObject("classRoom");
classRoom.setName(classRoomObject.getString("name"));
classRoom.setGrade(classRoomObject.getInteger("grade"));
student.setClassRoom(classRoom);
return (T) student;
}
return null;
}
}
ParserConfig.getGlobalInstance().setTypeConverter(new TypeConverter());
JSONObject jsonObject = new JSONObject();
Student student = new Student();
student.setId(1L);
student.setName("张三");
student.setAge(25);
Student.ClassRoom classRoom = student.new ClassRoom();
classRoom.setName("一年级一班");
classRoom.setGrade(1);
student.setClassRoom(classRoom);
jsonObject.put("student", student);
String jsonString = JSON.toJSONString(jsonObject);
System.out.println(jsonString);
JSONObject parse = JSON.parseObject(jsonString);
Student obj = parse.getObject("student", Student.class);
System.out.println(obj.getClassRoom().getName());
输出结果:
{"student":{"age":25,"classRoom":{"grade":1,"name":"一年级一班"},"id":1,"name":"张三"}}
一年级一班
4. 注解使用
Fastjson支持注解,可以对Bean对象中的字段进行注解配置,以更好的控制序列化和反序列化的结果。
// 注解使用
public class User {
@JSONField(name = "user_id")
private Long id;
private String name;
@JSONField(serialize = false)
private int age;
// 省略getter和setter
}
User user = new User();
user.setId(1L);
user.setName("张三");
user.setAge(25);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);
User parse = JSON.parseObject(jsonString, User.class);
System.out.println(parse.getId());
输出结果:
{"user_id":1,"name":"张三"}
1
四、总结
通过本篇文章对Fastjson进行了详细的说明和讲解,我们可以看到,Fastjson作为一个高性能的JSON解析器,具有非常易用的API接口和丰富的高级功能,可以满足我们在JSON序列化和反序列化中的绝大多数需求。