json详解以及fastjson使用教程

renjiaqi renjiaqi     2023-05-07     342

关键词:


Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言。在使用Java做Web开发时,不可避免的会遇到Json的使用。下面我们就简单讲一下Json的使用以及fastjson.jar包的使用。

一:JSON形式与语法
1.1:JSON对象
我们先来看以下数据:


"ID": 1001,
"name": "张三",
"age": 24

第一个数据就是一个Json对象,观察它的数据形式,可以得出以下语法:

1:数据在花括号中

2:数据以"键:值"对的形式出现(其中键多以字符串形式出现,值可取字符串,数值,甚至其他json对象)

3:每两个"键:值"对以逗号分隔(最后一个"键:值"对省略逗号)

遵守上面3点,便可以形成一个json对象。

1.2: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号"

这是上面两个基本形式结合出来的一种变形,通过这种变形,使得数据的封装具有很大的灵活性,能让开发者自由的发挥想象力。

1.3:JSON字符串
JSON字符串也是在平时开发中使用较多的,json字符串应满足以下条件:

1:它必须是一个字符串,由" "或者‘ ‘包裹数据,支持字符串的各种操作

2:里面的数据格式应该要满足其中一个格式,可以是json对象,也可以是json对象数组或者是两种基本形式的组合变形。

总结:json可以简单的分为基本形式:json对象,json对象数组。两种基本格式组合变形出其他的形式,但其本质还是json对象或者json对象数组中的一种。json对象或对象数组可以转化为json字符串,使用于不同的场合。

注意点:在封装json数据的时候,很容易出现错误,比如粗心的在最后一条数据的末尾加上了逗号等等,这里我提供一个在线验证工具,方便大家验证json数据格式的正确性

http://www.bejson.com/

二:fastjson介绍与使用
2.1:fastjson简介与jar下载
fastjson.jar是阿里爸爸开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现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的使用,首先应该在Java工程中导入对应的fastjson.jar包,

fastjson.jar包原始下载地址:https://github.com/alibaba/fastjson

点击页面中的download即可下载最新的包

 

fastjson.jar包百度云盘下载地址:https://pan.baidu.com/s/1CCGoRCdSjNUDB736cRCDBw

2.2:fastjson源码分析与使用
在包中,可以发现主要的3个类,JSON,JSONArray,JSONObject

三者之间的关系如下,JSONObject和JSONArray继承JSON

 技术图片

 

 

 

如果你们看不到源代码,请参考另一篇博客,先安装Java反编译工具:

https://blog.csdn.net/srj1095530512/article/details/81587601

联系上面讲到的json基础知识并对应这三个类,可以发现,JSONObject代表json对象,JSONArray代表json对象数组,

JSON代表JSONObject和JSONArray的转化。

JSONObject类源码分析与使用

技术图片

 

 

 


观察该类的继承与实现关系,不难发现,JSONObject实现了Map接口,而json对象中的数据都是以"键:值"对形式出现,可以猜想,      JSONObject底层操作是由Map实现的。

再来看类中的主要方法:

 技术图片

 

 

 

类中主要是get()方法。因为JSONObject相当于json对象,所以该类中主要封装了各种get方法,通过"键:值"对中的键来获取其对应的值。且方法的输入参数几乎皆为String类型,这是因为json对象中,"键:值"对的键都是String类型的。来看一下平时用到较多的               getString(String key)方法,该方法输入参数为String key(键),输出为String ,用于获取json对象中的字符串型数据。例如通过该方法获取  "name":"bob"键值对中name这个键所对应的值bob。

 技术图片

 

 

 

看其源码,可以发现,内部主要是由get(key)方法实现,找到这个方法如下:

 技术图片

 

 

 技术图片

 

 

 

 

发现内部主要由Map接口中的get()方法实现。

再去看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类。之所以把这个放在最后,是因为这个类主要是实现转化用的,最后的数据获取,还是要通过上面的JSONObject和JSONArray来实现。

JSON类源码分析与使用
先来看一下这个类中的主要方法,方法比较多,也分为两部分:

 技术图片

 

 

 


仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。

JSON类之toJSONString()方法,实现json对象转化为json字符串和javabean对象转化为json 字符串

技术图片

 

 

 


该方法经过多次重载,但最终都是实现json对象转化为json字符串和javabean对象转化为json 字符串。其中,有关键字transient修饰的toJSONString()用于json对象序列化过程中,希望某个"键:值"对数据不变的应用中。

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>
与parseObject()方法类似,parseArray()将json字符串转化为json对象数组或转化成包含泛型的List

 技术图片

 

 

 

JSON类之toJSON()方法,实现javabean对象转化为json对象
该方法用的比较少,主要用于将javabean对象转化为json对象,内部通过Map,LinkedHashMap,HashMap等集合接口实现。

 技术图片

 

 

 

JSON类之toJavaObject()方法,实现json对象转化为javabean对象
该方法也经过重载,通过TypeReference类和Class类反射来实现,主要讲json对象转化为javabean对象,用的也比较少。

 技术图片

 

 

至此,JSON类中的方法也讲解的差不多了,下面给出Java实例来实现以上的各种转换。

测试类:

package jsonTest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;


public class MyJson

public static void main(String[] args)

List<Student> list=new ArrayList<>();
Student student=new Student("bob",24);
Student student12=new Student("lily", 23);
list.add(student);
list.add(student12);
System.out.println("*******javaBean to jsonString*******");
String str1=JSON.toJSONString(student);
System.out.println(str1);
System.out.println(JSON.toJSONString(list));
System.out.println();

System.out.println("******jsonString to javaBean*******");
//Student stu1=JSON.parseObject(str1,new TypeReference<Student>());
Student stu1=JSON.parseObject(str1,Student.class);
System.out.println(stu1);
System.out.println();

System.out.println("******javaBean to jsonObject******");
JSONObject jsonObject1=(JSONObject)JSON.toJSON(student);
System.out.println(jsonObject1.getString("name"));
System.out.println();

System.out.println("******jsonObject to javaBean******");
Student student2=JSON.toJavaObject(jsonObject1, Student.class);
System.out.println(student2);
System.out.println();

System.out.println("*******javaBean to jsonArray******");
List<Student> stulist=new ArrayList<>();
for(int i=0;i<5;i++)
stulist.add(new Student("student"+i, i));


JSONArray jsonArrays=(JSONArray)JSON.toJSON(stulist);
for(int i=0;i<jsonArrays.size();i++)
System.out.println(jsonArrays.getJSONObject(i));

System.out.println();

System.out.println("*****jsonArry to javalist******");
List<Student> myList=new ArrayList<>();
for(int i=0;i<jsonArrays.size();i++)

Student student3=JSON.toJavaObject(jsonArrays.getJSONObject(i), Student.class);
myList.add(student3);

for(Student stu:myList)
System.out.println(stu);


System.out.println();

System.out.println("*****jsonObject to jsonString*****");
String str4=JSON.toJSONString(jsonObject1);
System.out.println(str4);
System.out.println();

System.out.println("*******jsonString to jsonObject*****");
JSONObject jso1=JSON.parseObject(str1);
System.out.println(jso1.getString("name"));
System.out.println();

System.out.println("*****jsonString to jsonArray*****");
JSONArray jArray=JSON.parseArray(JSON.toJSONString(stulist));
for(int i=0;i<jArray.size();i++)
System.out.println(jArray.getJSONObject(i));

System.out.println();



测试类对应的javabean类:

package jsonTest;

public class Student

private String name;
private int age;

public Student()
// TODO Auto-generated constructor stub


public Student(String name,int age)
this.name=name;
this.age=age;


public void setName(String name)
this.name=name;



public String getName()
return name;


public void setAge(int age)
this.age=age;


public int getAge()
return age;


@Override
public String toString()
// TODO Auto-generated method stub
return "student [name="+name+" , "+"age="+age+"]";



————————————————
版权声明:本文为CSDN博主「名字真难娶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/srj1095530512/article/details/82529759

fastjson使用教程

...不高效,所以这里介绍两种json数据解析的方式,一种是FastJSon,这个是阿里巴巴出的,号称最快的解析速度。第二种使我们伟大的Google提供的Gson来解析json,两个解析json都很方便,而且都很强大,在我使用中,基本上都满足 查看详情

fastjson详解(代码片段)

一、fastjson介绍​在前后端数据传输交互中,经常会遇到字符串(String)与json,XML等格式相互转换与解析,其中json以跨语言,跨前后端的优点在开发中被频繁使用,基本上可以说是标准的数据交换格式。fastjson是一个java语... 查看详情

java:工具类

...使用:https://www.cnblogs.com/koal/p/5161743.html Json详解以及fastjson使用教程:https://blog.csdn.net/srj1095530512/article/details/82529759 查看详情

fastjson解析超长json串以及转成list,map等方法实例

...的数据最后在进行处理.转换成对象使用的是阿里巴巴的fastjson,上度娘找了一下,好多使用的是:import net.sf.json.JSONArray;import net.sf.json.JSONObject;这两个,可 查看详情

springboot系列教程05:fastjson的集成配置及使用

springBoot自带的json用着不太习惯,已习惯了fastJSON,下面介绍下fastjson的配置 1.pom引入    <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.15< 查看详情

android学习笔记之fastjson的使用

PS:最近这两天发现了FastJson感觉实在是强大.. 学习内容:1.什么是FastJson2.如何使用FastJson3.FastJson的相关原理4.FastJson的优势,以及为什么推荐使用FastJson 1.FastJson的相关介绍 说道Json想必我们都不陌生,数据传输的两种形... 查看详情

安卓数据解析之fastjson的解析以及gson解析

...卓亲爹提供了我们Gson解析工具。点击下载Gson.jar阿里巴巴FastJson是一个Json处理工具包,包含“序列化”和“反序列化”两部分,它具备例如以下特征:速度最快。測试表明。fastjson具有极快的性能。超越任其它的JavaJsonparser。包... 查看详情

fastjson的使用

fastJson对于json格式字符串的解析主要用到了一下三个类:JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。JSONObject:fastJson提供的json对象。JSONArray:fastJson提供json数组对象。我们可以把JSONObject当成一个Map... 查看详情

gson、fastjson、jackson、json-lib对比总结

...较:在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,如果只是功能要求,没有性能要求,可以使用google的Gson,如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean2.1... 查看详情

六十一postmen使用教程以及json提取

首先安装,双击     选择谷歌进入不用注册,新建项目        json提取要用到Javascript代码举例如果我们要取响应数据的id的话varjsonData=pm.response.json();//从响应数据提取出reasonvarid=jsonData.da... 查看详情

json工具类库:alibaba/fastjson使用记录

JSON工具类库:alibaba/fastjson使用记录一、了解JSONJSON标准规范中文文档:http://www.json.org/json-zh.html最佳实践:http://kimmking.github.io/2017/06/06/json-best-practice/(JSON的高级使用,特别十分有参考价值)二、项目地址和Wiki:Git地址:https://... 查看详情

fastjson的常用用法以及自定义排序

fastJson的四种常用方法JSON转POJOpublicstatic<T>TgetObject(Stringpojo,Class<T>tclass){returnJSONObject.parseObject(pojo,tclass);}POJO转JSONpublicstatic<T>StringgetJson(TtResponse){returnJSONOb 查看详情

fastjson使用笔记

虽然使用FastJSON来生成JSON数据非常简单,但是我在实际使用过程中还是发现了一些值得注意的地方,比如说:之前写过的JQuery解析FastJSON生成的JSON数据会出现的错误今天我要记录一下一些其他的注意点将对象转化为json字符串时... 查看详情

springboot:使用fastjson解析json数据

...2.我们直接使用@Bean注入第三方的解析框架。 1、引入fastJson的依赖库<depe 查看详情

fastjson使用

简介Fastjson是一个Java语言编写的高性能功能完善的JSON库。高性能fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson。并且还超越了google的二进制协议protocolbuf。支持标准Fastjson完全支持h... 查看详情

阿里巴巴fastjson包的使用解析json数据

Fastjson是一个Java语言编写的高性能功能完善的JSON库。由阿里巴巴公司团队开发的.主要特性主要体现在以下几个方面:1.高性能fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson。并且还... 查看详情

fastjson使用

json字符串转map结构LinkedHashMap<String,String>jsonMap=JSON.parseObject(jsonStr,newTypeReference<LinkedHashMap<String,String>>(){}); 查看详情

fastjson顺序遍历json字段

fastJson在把json格式的字符串转换成JSONObject的时候,使用的是HashMap,所以排序规则是根据HASH值排序的,如果想要按照字符串顺序遍历JSON属性,需要在转换的时候指定使用LinkedHashMap代替HashMap。publicstaticvoidmain(String[]args){StringjsonStr="... 查看详情