一、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 Mapmap = new HashMap<>(); map.put("name", "张三"); map.put("age", "25"); String jsonString = JSON.toJSONString(map); System.out.println(jsonString); Map parse = JSON.parseObject(jsonString, new TypeReference
输出结果:
{"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 publicT convert(Object value, Class 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序列化和反序列化中的绝大多数需求。