com.alibaba.fastjson 初介绍
com.alibaba.fastjson
目录
com.alibaba.fastjson
Json
一:什么是Json
二:JSON形式与语法
三: JSON对象数组
四: JSON字符串
fastjson介绍与使用
一: fastjson简介与jar下载
二: fastjson源码分析与使用
JSONObject
JSONArray类源码分析与使用
JSON类
实例
1 JAVA对象转JSON字符串
2 JSON字符串转JAVA简单对象
3 JSON字符串转JSON对象
4 JSON字符串 数组类型与JAVA对象的转换
5 JAVA对象转JSON对象
参考文章
Json
一:什么是Json
Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言。在使用Java做Web开发时,不可避免的会遇到Json的使用。下面我们就简单讲一下Json的使用以及fastjson.jar包的使用。
二:JSON形式与语法
{"ID": 1001,"name": "张三","age": 24
}
1:数据在花括号中
2:数据以"键:值"对的形式出现(其中键多以字符串形式出现,值可取字符串,数值,甚至其他json对象)
3:每两个"键:值"对以逗号分隔(最后一个"键:值"对省略逗号)
遵守上面3点,便可以形成一个json对象。
三: JSON对象数组
[{"ID": 1001, "name": "张三", "age": 24},{"ID": 1002, "name": "李四", "age": 25},{"ID": 1003, "name": "王五", "age": 22}
]
1:数据在方括号中(可理解为数组)
2:方括号中每个数据以json对象形式出现
3:每两个数据以逗号分隔(最后一个无需逗号)
遵守上面3点,便可形成一个json对象数组(及一个数组中,存储了多个json对象)
理解了上面两种基本的形式,我们就可以得出其他的数据形式,例如下面这个:
{"部门名称":"研发部","部门成员":[{"ID": 1001, "name": "张三", "age": 24},{"ID": 1002, "name": "李四", "age": 25},{"ID": 1003, "name": "王五", "age": 22}],"部门位置":"xx楼21号"
}
四: JSON字符串
JSON字符串也是在平时开发中使用较多的,json字符串应满足以下条件:
1:它必须是一个字符串,由" "或者' '包裹数据,支持字符串的各种操作
2:里面的数据格式应该要满足其中一个格式,可以是json对象,也可以是json对象数组或者是两种基本形式的组合变形。
总结:json可以简单的分为基本形式:json对象,json对象数组。两种基本格式组合变形出其他的形式,但其本质还是json对象或者json对象数组中的一种。json对象或对象数组可以转化为json字符串,使用于不同的场合。
fastjson介绍与使用
你可以通过如下地方下载fastjson:
- maven中央仓库: http://central.maven.org/maven2/com/alibaba/fastjson/
- Sourceforge.net : https://sourceforge.net/projects/fastjson/files/
- 在maven项目的pom文件中直接配置fastjson依赖
fastjson最新版本都会发布到maven中央仓库,你可以直接依赖。
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>x.x.x</version>
</dependency>
Fastjson 主要的API
首先看下这个的maven的仓库。
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version>
</dependency>
一: fastjson简介与jar下载
fastjson.jar是阿里巴巴开发的一款专门用于Java开发的包,1 可以方便的实现json对象与JavaBean对象的转换,2 实现JavaBean对象与json字符串的转换,3 实现json对象与json字符串的转换。除了这个fastjson以外,还有Google开发的Gson包,其他形式的如net.sf.json包,都可以实现json的转换。方法名称不同而已,最后的实现结果都是一样的。
将json字符串转化为json对象
在net.sf.json中是这么做的
JSONObject obj = new JSONObject().fromObject(jsonStr);//将json字符串转换为json对象在fastjson中是这么做的
JSONObject obj=JSON.parseObject(jsonStr);//将json字符串转换为json对象
二: fastjson源码分析与使用
联系上面讲到的json基础知识并对应这三个类,可以发现,JSONObject代表json对象,JSONArray代表json对象数组,
JSON代表JSONObject和JSONArray的转化。
JSONObject
观察该类的继承与实现关系,不难发现,JSONObject实现了Map接口,而json对象中的数据都是以"键:值"对形式出现,可以猜想, JSONObject底层操作是由Map实现的。
类中主要是get()方法。因为JSONObject相当于json对象,所以该类中主要封装了各种get方法,通过"键:值"对中的键来获取其对应的值。且方法的输入参数几乎皆为String类型,这是因为json对象中,"键:值"对的键都是String类型的。来看一下平时用到较多的
1 getString(String key)
getString(String key)方法,该方法输入参数为String key(键),输出为String ,用于获取json对象中的字符串型数据。例如通过该方法获取 "name":"bob"键值对中name这个键所对应的值bob。
instanceof
发现内部主要由Map接口中的get()方法实现。
2 getInteger(String key)
再去看JSONObject中另一个常用的方法getInteger(String key),该方法获取json对象中的整型数据,例如获取"age:20"键值对中age对应的整型数值20.
对比getString(String key)方法,两者极为相似,都是通过Map接口的get()方法实现。
再看几个其他的方法,也是由Map接口中的相应方法实现的,这里不再赘述。
总结:JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。
JSONArray类源码分析与使用
观察JSONArray的继承与实现,并结合上面对JSONObject的分析,不难发现,其内部是有List接口中的方法来完成操作的。
同样观察JSONArray类中的方法,由于方法较多,下面分为两部分
首先来明确一点,因为JSONArray代表json对象数组,json数组对象中存储的是一个个json对象,所以类中的方法主要用于直接操作json对象。比如这其中的add(),remove(),containsAll()方法,对应于json对象的添加,删除与判断。
其内部主要有List接口中的对应方法来实现。
跟JSONObject一样,JSONArray里面也有一些get()方法,不过都不常用,最有用的应该是getJSONObject(int index)方法,该方法用于获取json对象数组中指定位置的JSONObject对象,配合size()方法,可用于遍历json对象数组中的各个对象。
通过以上两个方法,在配合for循环,即可实现json对象数组的遍历,当然JSONArray中也实现了迭代器方法来遍历,这和List的遍历极为相似。
通过遍历得到JSONObject对象,然后再利用JSONObject类中的get()方法,即可实现最终json数据的获取!!!
JSON类
好了,接下来我们看最后一个,也是最重要的一个类JSON类。之所以把这个放在最后,是因为这个类主要是实现转化用的,最后的数据获取,还是要通过上面的JSONObject和JSONArray来实现。
先来看一下这个类中的主要方法,方法比较多,也分为两部分:
仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。
1 toJSONString ()
该方法经过多次重载,但最终都是实现json对象转化为json字符串和javabean对象转化为json 字符串。其中,有关键字transient修饰的toJSONString()用于json对象序列化过程中,希望某个"键:值"对数据不变的应用中。
2 parseObject()
JSON类之parseObject()方法,实现json字符串转换为json对象或javabean对象
该方法返回JSONObject对象,用于实现json字符串向json对象的转化,其内部调用了parse()方法,调用底层的DefaultJSONParser解析类进行转化,在转化失败时,抛出can not cast to JSONObject异常。
该方法不仅能实现json字符串向json对象的转化,经过重载之后,还能实现json字符串向javabean对象的转化
json字符串与javaBean之间的转换可以使用 TypeReference<T> 这个类,也可以使用Class这个类。
Student stu1=JSON.parseObject(jsonstr,new TypeReference<Student>(){});
Student stu1=JSON.parseObject(jsonstr,Student.class);
用第二种Class类反射来实现,比较简单。
JSON类之JSONArray()方法,实现json字符串转化为json对象数组或List<T>
3 parseArray()
与parseObject()方法类似,parseArray()将json字符串转化为json对象数组或转化成包含泛型的List
4 toJSON()
JSON类之toJSON()方法,实现javabean对象转化为json对象
该方法用的比较少,主要用于将javabean对象转化为json对象,内部通过Map,LinkedHashMap,HashMap等集合接口实现。
5 toJavaObject()
JSON类之toJavaObject()方法,实现json对象转化为javabean对象
该方法也经过重载,通过TypeReference类和Class类反射来实现,主要讲json对象转化为javabean对象,用的也比较少。
fastjson 将对象中的空值输出
在fastjson中,缺省是不输出空值的。无论Map中的null和对象属性中的null,序列化的时候都会被忽略不输出,这样会减少产生文本的大小。但如果需要输出空值怎么做呢?
如果你需要输出空值,需要使用 SerializerFeature.WriteMapNullValue
Model obj = ...;
JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue);
Fastjson 处理日期
示例
1 JAVA对象转JSON字符串
//java对象转json字符串public static void beanTojson() {Data data = new Data();data.setAction("add");data.setId("1");data.setOrdinal(8L);data.setOrganUnitFullName("testJSON");data.setParent("0");data.setSuborderNo("58961");String s = JSON.toJSONString(data);System.out.println("toJsonString()方法:s=" + s);}
//输出结果{"action":"add","id":"1","ordinal":8,"organUnitFullName":"testJSON","parent":"0","suborderNo":"58961"}
2 JSON字符串转JAVA简单对象
//json字符串转java简单对象public static void jsonStrToJavaBean() {String s ="{\"action\":\"add\",\"id\":\"1\",\"ordinal\":8,\"organUnitFullName\":\"testJSON\",\"parent\":\"0\",\"suborderNo\":\"58961\"}";Data data = JSON.parseObject(s, Data.class);System.out.println("data对象"+data.toString());System.out.println("action="+data.getAction()+"---id="+data.getId());//data对象Data{id='1', suborderNo='58961', organUnitType='null', action='add', parent='0', organUnitFullName='testJSON', ordinal=8}//action=add---id=1/*** 另一种方式转对象*/Data dd = JSON.parseObject(s, new TypeReference<Data>() {});System.out.println("另一种方式获取data对象"+dd.toString());System.out.println("另一种方式获取="+dd.getAction()+"---id="+dd.getId());//另一种方式获取data对象Data{id='1', suborderNo='58961', organUnitType='null', action='add', parent='0', organUnitFullName='testJSON', ordinal=8}//另一种方式获取=add---id=1}
3 JSON字符串转JSON对象
//json字符串转json对象public static void jsonToJsonBean() {String s ="{\"action\":\"add\",\"id\":\"1\",\"ordinal\":8,\"organUnitFullName\":\"testJSON\",\"parent\":\"0\",\"suborderNo\":\"58961\"}";JSONObject jsonObject = JSON.parseObject(s);String action = jsonObject.getString("action");String id = jsonObject.getString("id");System.out.println("action ="+action);//addSystem.out.println("id ="+id);//1System.out.println("jsonObject ="+jsonObject);//action =add//id =1}
//jsonObject ={"parent":"0","organUnitFullName":"testJSON","action":"add","id":"1","suborderNo":"58961","ordinal":8}
4 JSON字符串 数组类型与JAVA对象的转换
{"errors":
[
{"code":"UUM70004","message":"组织单元名称不能为空","data":{"id":"254","suborderNo":"SUB_2018062797348039","organUnitType":"门","action":"add","parent":"10000","ordinal":0,"organUnitFullName":"组织单元全称"},"success":false},{"code":"UUM70004","message":"组织单元名称不能为空","data":{"id":"255","suborderNo":"SUB_2018062797348039","organUnitType":"部门","action":"add","parent":"10000","ordinal":0,"organUnitFullName":"组织单元全称"},"success":false}
]}
//json字符串--数组型与JSONArray对象之间的转换public static void jsonStrToJSONArray() {String str = "{\"errors\":[{\"code\":\"UUM70004\",\"message\":\"组织单元名称不能为空\",\"data\":{\"id\":\"254\",\"suborderNo\":\"SUB_2018062797348039\",\"organUnitType\":\"部门\",\"action\":\"add\",\"parent\":\"10000\",\"ordinal\":0,\"organUnitFullName\":\"组织单元全称\"},\"success\":false},{\"code\":\"UUM70004\",\"message\":\"组织单元名称不能为空\",\"data\":{\"id\":\"255\",\"suborderNo\":\"SUB_2018062797348039\",\"organUnitType\":\"部门\",\"action\":\"add\",\"parent\":\"10000\",\"ordinal\":0,\"organUnitFullName\":\"组织单元全称\"},\"success\":false}]}";JSONObject jsonObject = JSON.parseObject(str);JSONArray error = jsonObject.getJSONArray("errors");List<Error> errors = JSON.parseObject(error.toJSONString(), new TypeReference<List<Error>>() {});for (Error e: errors) {//Error的属性System.out.println("Error属性="+e.getSuccess());System.out.println("Error属性="+e.getCode());System.out.println("Error属性="+e.getMessage());//Error集合属性List<Data> datas = e.getData();for (Data d: datas) {System.out.println("data对象属性="+d.getId());System.out.println("data对象属性="+d.getAction());System.out.println("data对象属性="+d.getSuborderNo());}}//Error属性=false//Error属性=UUM70004//Error属性=组织单元名称不能为空//data对象属性=254//data对象属性=add//data对象属性=SUB_2018062797348039//Error属性=false//Error属性=UUM70004//Error属性=组织单元名称不能为空//data对象属性=255//data对象属性=add//data对象属性=SUB_2018062797348039}
5 JAVA对象转JSON对象
//javabean转json对象public static void jsonBenToJsonObject() {Data data = new Data();data.setAction("add");data.setId("1");data.setOrdinal(8L);data.setOrganUnitFullName("testJSON");data.setParent("0");data.setSuborderNo("58961");JSONObject jsonObj = (JSONObject) JSON.toJSON(data);JSON json = (JSON) JSON.toJSON(data);System.out.println("jsonObj"+jsonObj);System.out.println("json对象"+json);}
//jsonObj{"parent":"0","organUnitFullName":"testJSON","action":"add","id":"1","suborderNo":"58961","ordinal":8}
//json对象{"parent":"0","organUnitFullName":"testJSON","action":"add","id":"1","suborderNo":"58961","ordinal":8}
(1)对于JSON对象与JSON格式字符串的转换可以直接用 toJSONString()这个方法。
(2)javaBean与JSON格式字符串之间的转换要用到:JSON.toJSONString(obj);
(3)javaBean与json对象间的转换使用:JSON.toJSON(obj),然后使用强制类型转换,JSONObject或者JSONArray。
实例2
我们创建一个班级的对象,和一个学生对象如下:
班级对象
public class Grade {private Long id;private String name;private List<Student> users = new ArrayList<Student>();// 省略 setter、getterpublic void addStudent(Student student) {users.add(student);}@Overridepublic String toString() {return "Grade{" +"id=" + id +", name='" + name + '\'' +", users=" + users +'}';}
}
学生对象
public class Student {private Long id;private String name;// 省略 setter、getter@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +'}';}
}
运行的 Main 函数
public class MainTest {public static void main(String[] args) {Grade group = new Grade();group.setId(0L);group.setName("admin");Student student = new Student();student.setId(2L);student.setName("guest");Student rootUser = new Student();rootUser.setId(3L);rootUser.setName("root");group.addStudent(student);group.addStudent(rootUser);// 转换为 JSONString jsonString = JSON.toJSONString(group);System.out.println("JSON字符串:" + jsonString);// 转换为 对象BEANGrade grade = JSON.parseObject(jsonString, Grade.class);System.out.println("JavaBean对象:" + grade);}
}
最后的运行结果如下:
JSON字符串:
{"id":0,"name":"admin","users":[{"id":2,"name":"guest"},{"id":3,"name":"root"}]}JavaBean对象:
Grade{id=0, name='admin', users=[Student{id=2, name='guest'}, Student{id=3, name='root'}]}
https://zonghaishang.gitbooks.io/fastjson-source-code-analysis/content/serializer/serializerWriter_part1.html
参考文章
https://blog.csdn.net/srj1095530512/article/details/82529759
https://www.cnblogs.com/jajian/p/10051901.html
大神的文章
https://blog.csdn.net/GarfieldEr007/article/details/84832748
com.alibaba.fastjson 初介绍相关推荐
- com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现$ref:$[0]现象问题
1.今天定义了一个JSONObject对象,引用的com.alibaba.fastjson.JSONObject,循环给这个对象赋值出现"$ref":"$[0]" ...
- alibaba Fastjson的JOSN解析库 -
JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想的数据交换 ...
- com.alibaba.fastjson.JSONObject cannot be cast to XXX异常解决
项目开发中遇到过几次这个问题,所以记录一下,代码如下: 1 @PostMapping("/save-files") 2 public void addFiles(@RequestB ...
- Alibaba fastjson 序列化与反序列化
fastjson在官网的定义号称最小最快 多态的json序列化工具.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson.并且还超越了go ...
- 解决 fastjson 泛型报错 : java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to X
错误堆栈: Process: com.huawei.himovie1, PID: 20329java.lang.ClassCastException: com.alibaba.fastjson.JSO ...
- 解决com.alibaba.fastjson.JSONException: autoType is not support
转载自 https://blog.csdn.net/cdyjy_litao/article/details/72458538 最近发现进程运行日志中出现很多下面的日志: com.alibaba.fas ...
- 探索RequestBody报com.alibaba.fastjson.JSONObject cannot be cast to xxx
今天使用RequestBody接受前端传过来的参数,以前接受字符串数组非常成功,这次把形参改成了List<User>,原本以为顺利接受参数并映射成User的list结构,结果竟然在我取us ...
- com.alibaba.fastjson.JSONObject之对象与JSON转换方法
com.alibaba.fastjson.JSONObject时经常会用到它的转换方法,包括Java对象转成JSON串.JSON对象,JSON串转成java对象.JSON对象,JSON对象转换Java ...
- com.alibaba.fastjson.JSONException: not close json text, token : :
flink从kafka读数据报错: com.alibaba.fastjson.JSONException: not close json text, token : : 解决方案: kafka中的js ...
最新文章
- Centos 7环境下源码安装PostgreSQL数据库
- centos标准分区调整大小_去繁化简解决CentOS下调整home和根分区大小的方法
- java gettime_Java Util.getTime方法代码示例
- android n 发布时间,Android N 正式版将在9月发布
- C语言正则表达式regex
- 不使用资源文件动态创建对话框的做法
- 爬虫mm131明星照片
- 用c语言双向循环链表,C语言实现双向循环链表
- 同义词词林 使用 java_利用同义词林计算词的相似度——基于路径与深度的同义词词林词语相似度计算...
- HIKSDK/大华SDK协议视频融合平台EasyCVR移动侦测录像功能无法在后台显示优化过程
- pidgin qq_充分利用Pidgin的5条提示和技巧
- 开心网(http://www.kaixin001.com)的一些JS代码分享
- oracle中 greatest、east、coalesce
- 电脑上怎么调出输入法
- 认知层次不同的人,是很难沟通的
- 电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析
- kettle web 版本 (webspoon) 中文部署 kettle 页面编辑 kettleweb 中文
- BIOS 中断向量表
- django考点答案
- 首期“赛迪区块链技术与应用培训班”成功举办
热门文章
- docker启动nginx及常见nginx配置
- python学习day2
- 服务器搭建博客(二):服务器LNMP环境搭建
- android 序列化传参数,android 传值 序列化
- java中join_java中join的使用
- 出现java.lang.VerifyError:Bad type operand stack错误
- 间谍软件“飞马”监视超 50 个国家手机用户
- 【翻译】Java使用Mockito进行Mock测试
- linux开发板开机自启动脚本,linux 添加开机自启动脚本
- 重新认识HTML(一)别来无恙