学习链接:https://www.bilibili.com/video/BV1y5411s7jk
FastJson源码地址:https://github.com/alibaba/fastjson
FastJson中文Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
中文手册 : 2-2Fastjson JSONField - FastJson中文手册 (dba.cn)
教程:Fastjson 简明教程 | 菜鸟教程 (runoob.com)
(60条消息) FastJson笔记_codertl-CSDN博客
1、FastJson简介
- Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
2、FastJson优点
1. 速度快
fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。
2. 使用广泛
fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。
3. 测试完备
fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。
4. 使用简单
fastjson的API十分简洁。
String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}", VO.class); //反序列化
3、使用
3.1 配置maven
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> </dependencies>
3.2 @JSONField
3.2.1 注意:
FastJson 在进行操作时,是根据 getter 和 setter 的方法进行的,并不是依据 Field 进行。
若属性是私有的,必须有 set 方法。否则无法反序列化。
3.2.2 @JSONField
package com.alibaba.fastjson.annotation; public @interface JSONField { // 配置序列化和反序列化的顺序,1.1.42版本之后才支持 int ordinal() default 0; // 指定字段的名称 String name() default ""; // 指定字段的格式,对日期格式有用 String format() default ""; // 是否序列化 boolean serialize() default true; // 是否反序列化 boolean deserialize() default true; }
3.2.3 FieldInfo可以配置在getter/setter方法或者字段上
3.2.3.1 配置在getter setter上
public class A { private int id; @JSONField(name="ID") public int getId() {return id;} @JSONField(name="ID") public void setId(int value) {this.id = id;} }
3.2.3.2 配置在field上
public class A { @JSONField(name="ID") private int id; public int getId() {return id;} public void setId(int value) {this.id = id;} }
3.2.3.3 使用format配置日期格式化
public class A { // 配置date序列化和反序列使用yyyyMMdd日期格式 @JSONField(format="yyyyMMdd") public Date date; }
3.2.3.4 使用serialize/deserialize指定字段不序列化
public class A { @JSONField(serialize=false) public Date date; } public class A { @JSONField(deserialize=false) public Date date; }
3.2.3.5 使用ordinal指定字段的顺序
public static class VO { @JSONField(ordinal = 3) private int f0; @JSONField(ordinal = 2) private int f1; @JSONField(ordinal = 1) private int f2; }
3.3 序列化与反序列化
3.3.1 Java对象 转成 JSON字符串
Student stu = new Student(); stu.setName("张三"); stu.setAge(15); stu.setAddress("成都"); // java对象 转换成 JSON 字符串 String jsonString = JSON.toJSONString(stu); System.out.println(jsonString); // {"address":"成都","age":15,"name":"张三"}
3.3.2 list集合转JSON格式的字符串
@Test public void test1() { // List集合转 JSON字符串 ArrayList<Student> list = new ArrayList<>(); Student stu1 = new Student(); stu1.setId(1); stu1.setAge(22); stu1.setName("king"); stu1.setFlag(true); stu1.setAddress("成都"); Student stu2 = new Student(); stu2.setId(2); stu2.setAge(24); stu2.setName("green"); stu2.setFlag(false); stu2.setAddress("重庆"); list.add(stu1); list.add(stu2); String jsonString = JSON.toJSONString(list,SerializerFeature.PrettyFormat); System.out.println(jsonString); } /* [ { "address":"成都", "age":22, "flag":true, "id":1, "name":"king" }, { "address":"重庆", "age":24, "flag":false, "id":2, "name":"green" } ] */
3.3.3 Map集合转成 JSON字符串
@Test public void test2() { // Map集合 转JSON格式字符串 HashMap<String, Student> map = new HashMap<>(); Student stu1 = new Student(); stu1.setId(1); stu1.setAge(22); stu1.setName("king"); stu1.setFlag(true); stu1.setAddress("成都"); Student stu2 = new Student(); stu2.setId(2); stu2.setAge(24); stu2.setName("green"); stu2.setFlag(false); stu2.setAddress("重庆"); map.put("stu1", stu1); map.put("stu2", stu2); String jsonString = JSON.toJSONString(map,SerializerFeature.PrettyFormat); System.out.println(jsonString); } /* { "stu2":{ "address":"重庆", "age":24, "flag":false, "id":2, "name":"green" }, "stu1":{ "address":"成都", "age":22, "flag":true, "id":1, "name":"king" } } */
3.3.4 JSON字符串 转换成 Java对象 parseObject
String data = "{\"address\":\"成都\",\"age\":15,\"name\":\"张三\"}"; JSONObject parseObject = JSON.parseObject(data); // System.out.println(parseObject); String address = parseObject.getString("address"); Integer age = parseObject.getInteger("age"); System.out.println(address); // 成都 System.out.println(age); // 15
3.3.5 JSON字符串 转成 List集合
@Test public void test3() { // JSON格式字符串转成List 集合 String jsonString = "[{\"address\":\"成都\",\"age\":22,\"flag\":true,\"id\":1,\"name\":\"king\"},{\"address\":\"重庆\",\"age\":24,\"flag\":false,\"id\":2,\"name\":\"green\"}]"; List<Student> students = JSON.parseArray(jsonString, Student.class); for (Student stu :students) { System.out.println(stu); } } /* Student(id=1, age=22, name=king, address=成都, flag=true) Student(id=2, age=24, name=green, address=重庆, flag=false) */
3.3.6 JSON字符串 转成 Map集合
@Test public void test4() { // JSON格式字符串转成 Map集合 String jsonString = "{\"stu2\":{\"address\":\"重庆\",\"age\":24,\"flag\":false,\"id\":2,\"name\":\"green\"},\"stu1\":{\"address\":\"成都\",\"age\":22,\"flag\":true,\"id\":1,\"name\":\"king\"}}"; Map<String,Student> map = JSON.parseObject(jsonString, new TypeReference<HashMap<String, Student>>(){} ); System.out.println(map); } /* { stu2=Student(id=2, age=24, name=green, address=重庆, flag=false), stu1=Student(id=1, age=22, name=king, address=成都, flag=true) } */