Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
在maven项目的pom文件中直接配置fastjson依赖,fastjson最新版本都会发布到maven中央仓库,你可以直接依赖。
com.alibaba
fastjson
x.x.x
其中x.x.x是版本号,根据需要使用特定版本,建议使用最新版本。
主要的3个类,JSON、JSONArray、JSONObject。JSONObject和JSONArray继承JSON。
JSONObject代表json对象,JSONArray代表json对象数组,JSON代表JSONObject和JSONArray的转化。
对于JSON、JSONArray、JSONObject我的理解:
JSON提供了基本的转换方法,例如
JSON.toJSONString:将java对象转换为json字符串
JSON.parseObject:json字符串转换为指定java对象或转换为列表或者转换为JSONObject对象
JSON.parseArray:json字符串转换为JSONArray。而JSONObject对象继承了JSON,且实现了Map类。所以JSONObject是进一步封装类,这个类的主要作用就是,将Json字符串转换为JSONObject对象之后,实际上就相当于将Json字符串转换成了Map类型的key-value的格式,所以提供了很多丰富的api,可以让我们像操作Map对象那样,去操作JSONObject。例如去获得json字符串中某个属性,或某个节点下的属性。
JSONArray对象也继承了JSON,但是实现了List类,所以JOSNArray也是经过进一步的封装,这个类的主要作用就是,将Json字符串转换为JSONArray之后,实际上就相当于转换成了List类型的,提供了很多像操作List那样的api,例如判断该列表是否为空,或者获取某个索引下的属性。
所以我们使用fastObject时,如果只需要简单的转换,我们直接使用JSON类中的转换方法即可,但是如果需要更加细致的操作,例如直接获取json字符串中某个属性或者某个节点下的属性,可以进一步转换为JSONObject或者JSONArray来操作会更方便。
序列化
String jsonString = JSON.toJSONString(obj);
反序列化:
VO vo = JSON.parseObject("…", VO.class);
泛型反序列化:
import com.alibaba.fastjson.TypeReference; List list = JSON.parseObject("…", new TypeReference() {});
//对象转换为Json字符串
Student student = new Student("姓名", null, LocalDateTime.now());
String s = JSON.toJSONString(student);
System.out.println("对象转json:"+s);
//列表转json字符串
List students = new ArrayList<>();
students.add(new Student("姓名","年龄",LocalDateTime.now()));
students.add(new Student("姓名","年龄",LocalDateTime.now()));
students.add(new Student("姓名","年龄",LocalDateTime.now()));
String s1 = JSON.toJSONString(students);
System.out.println("List转json:"+s1);
//Map类型转字符串
Map map = new HashMap<>();
map.put(1,new Student("姓名","年龄",LocalDateTime.now()));
map.put(2,new Student("姓名","年龄",LocalDateTime.now()));
map.put(3,new Student("姓名","年龄",LocalDateTime.now()));
String s2 = JSON.toJSONString(map);
System.out.println("Map转json:"+s2);
//Map类型中有List 转字符串
Map> map1 = new HashMap<>();
map1.put(1,students);
map1.put(2,students);
map1.put(3,students);
String s3 = JSON.toJSONString(map1);
System.out.println("Map中含有List转json:"+s3);
//json转换为对象
Student student1 = JSON.parseObject("{\"age\":\"性别\",\"name\":\"姓名\",\"time\":\"2023-12-22T11:01:32.870\"}", Student.class);
System.out.println("json转换为对象:"+student1);
//json转换为List
//使用parseObject
List studentList = JSON.parseObject("[{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"}]"
, new TypeReference>() {});
System.out.println("json转换为List:"+studentList);
//使用parseArray
List studentList1 = JSON.parseArray("[{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"}]"
, Student.class);
System.out.println("json转换为List:"+studentList1);
//json转Map
//使用parseObject
Map map2 = JSON.parseObject("{1:{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:10:57.807\"},2:{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:10:57.807\"},3:{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:10:57.807\"}}"
, new TypeReference
对象转json:{"name":"姓名","time":"2023-12-22T15:28:18.474"}
List转json:[{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"},{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"},{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"}]
Map转json:{1:{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.927"},2:{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.927"},3:{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.927"}}
Map中含有List转json:{1:[{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"},{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"},{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"}],2:[{"$ref":"$[1][0]"},{"$ref":"$[1][1]"},{"$ref":"$[1][2]"}],3:[{"$ref":"$[1][0]"},{"$ref":"$[1][1]"},{"$ref":"$[1][2]"}]}
json转换为对象:Student(name=姓名, age=性别, time=2023-12-22T11:01:32.870)
json转换为List:[Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592), Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592), Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592)]
json转换为List:[Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592), Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592), Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592)]
json转Map:{1=Student(name=姓名, age=年龄, time=2023-12-22T15:10:57.807), 2=Student(name=姓名, age=年龄, time=2023-12-22T15:10:57.807), 3=Student(name=姓名, age=年龄, time=2023-12-22T15:10:57.807)}
JSONObject实现了Map接口,所以Map对象可以直接添加JSONObject中的属性,可以理解为JSONObject就是key为String,Value为String的Map对象,但是又在此基础上封装了很多方法。
JSONArray实现了List接口,所以List对象也可以直接添加JSONArray中的属性,可以理解为JSONArray中都是string类型的列表。
String str = "{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:51:01.993\"}";
String arrayStr = "[{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:51:01.993\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:51:01.993\"}]";
//parse将对象转换为String
Object parse = JSON.parse(arrayStr);
//parseObject转换为java对象,如果不指定对象类型,就转换为JSONObject类型,如果指定 就转换为指定类型
JSONObject jsonObject = JSON.parseObject(str);
Student student = JSON.parseObject(str, Student.class);
//parseArray转换为列表,如果不指定列表类型,就转换为List类型,如果指定 就转换为指定类型列表
JSONArray jsonArray = JSON.parseArray(arrayStr);
List students = JSON.parseArray(arrayStr, Student.class);
toJSON()、toJavaObject()、toJSONBytes():
//toJSON,转换为Object,也可以强制转换为某种类型
Object o = JSON.toJSON(student1);
JSONObject o1 = (JSONObject)JSON.toJSON(student1);
//toJavaObject,将JSONObject转换为指定的java对象
JSONObject jsonObject1 = JSON.parseObject(str);
Student student4 = JSON.toJavaObject(jsonObject1, Student.class);
//toJSONBytes,将java对象转换为字节数组
byte[] bytes = JSON.toJSONBytes(student1);