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"}

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}

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 初介绍相关推荐

  1. com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现$ref:$[0]现象问题

    1.今天定义了一个JSONObject对象,引用的com.alibaba.fastjson.JSONObject,循环给这个对象赋值出现"$ref":"$[0]" ...

  2. alibaba Fastjson的JOSN解析库 -

    JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想的数据交换 ...

  3. com.alibaba.fastjson.JSONObject cannot be cast to XXX异常解决

    项目开发中遇到过几次这个问题,所以记录一下,代码如下: 1 @PostMapping("/save-files") 2 public void addFiles(@RequestB ...

  4. Alibaba fastjson 序列化与反序列化

    fastjson在官网的定义号称最小最快 多态的json序列化工具.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson.并且还超越了go ...

  5. 解决 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 ...

  6. 解决com.alibaba.fastjson.JSONException: autoType is not support

    转载自 https://blog.csdn.net/cdyjy_litao/article/details/72458538 最近发现进程运行日志中出现很多下面的日志: com.alibaba.fas ...

  7. 探索RequestBody报com.alibaba.fastjson.JSONObject cannot be cast to xxx

    今天使用RequestBody接受前端传过来的参数,以前接受字符串数组非常成功,这次把形参改成了List<User>,原本以为顺利接受参数并映射成User的list结构,结果竟然在我取us ...

  8. com.alibaba.fastjson.JSONObject之对象与JSON转换方法

    com.alibaba.fastjson.JSONObject时经常会用到它的转换方法,包括Java对象转成JSON串.JSON对象,JSON串转成java对象.JSON对象,JSON对象转换Java ...

  9. com.alibaba.fastjson.JSONException: not close json text, token : :

    flink从kafka读数据报错: com.alibaba.fastjson.JSONException: not close json text, token : : 解决方案: kafka中的js ...

最新文章

  1. Centos 7环境下源码安装PostgreSQL数据库
  2. centos标准分区调整大小_去繁化简解决CentOS下调整home和根分区大小的方法
  3. java gettime_Java Util.getTime方法代码示例
  4. android n 发布时间,Android N 正式版将在9月发布
  5. C语言正则表达式regex
  6. 不使用资源文件动态创建对话框的做法
  7. 爬虫mm131明星照片
  8. 用c语言双向循环链表,C语言实现双向循环链表
  9. 同义词词林 使用 java_利用同义词林计算词的相似度——基于路径与深度的同义词词林词语相似度计算...
  10. HIKSDK/大华SDK协议视频融合平台EasyCVR移动侦测录像功能无法在后台显示优化过程
  11. pidgin qq_充分利用Pidgin的5条提示和技巧
  12. 开心网(http://www.kaixin001.com)的一些JS代码分享
  13. oracle中 greatest、east、coalesce
  14. 电脑上怎么调出输入法
  15. 认知层次不同的人,是很难沟通的
  16. 电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析
  17. kettle web 版本 (webspoon) 中文部署 kettle 页面编辑 kettleweb 中文
  18. BIOS 中断向量表
  19. django考点答案
  20. 首期“赛迪区块链技术与应用培训班”成功举办

热门文章

  1. docker启动nginx及常见nginx配置
  2. python学习day2
  3. 服务器搭建博客(二):服务器LNMP环境搭建
  4. android 序列化传参数,android 传值 序列化
  5. java中join_java中join的使用
  6. 出现java.lang.VerifyError:Bad type operand stack错误
  7. 间谍软件“飞马”监视超 50 个国家手机用户
  8. 【翻译】Java使用Mockito进行Mock测试
  9. linux开发板开机自启动脚本,linux 添加开机自启动脚本
  10. 重新认识HTML(一)别来无恙