请求:JSON转换为Java对象
响应:Java对象转换为JSON
JSON
想完成跨内存(浏览器/服务器、服务器/服务器)的数据传输、对象转换,必须经过网络传输,而且需要一个传递信息的载体,还需要序列化和反序列化的操作
- 传递信息的载体
JSON简单来说就是特定格式的字符串,JSON的载体就是字符串。JS对象和Java对象都是对象,存活于内存中(浏览器/服务器),JSON只是字符串,只承担网络传输的角色:
在前端中本身没有JSON对象,在下面的内容里:
let person = {"name":"zhangsan","sex":"男","age":24}
这只是一个JS的字面量对象,只是JS对象的一个子集而已。因为满足JSON的格式被称为 JSON对象,但是这样是不太严谨的。
- 序列化和反序列化
在学习[[011-IO|IO流]]时学习过序列化流和反序列化流,通过这两种流就可以实现对象的序列化和反序列化
[!NOTE] Title
序列化:将对象状态转化为可保持或可传输的过程,一般的格式是与平台无关的二进制流,也可以将这种二进制流持久保存在磁盘上,或者通过网络将这种二进制流传输到另一个网络节点,在另一节点进行反序列化为对象。典型应用就是分布式系统
序列化的另一种用途则是作为不同工程间的远程通讯。对于一般的单体架构来说,不需要进行对象序列化,但是一旦涉及到远程调用或者分布式系统,一个系统调用另一个系统的服务时,POJO对象必须[[011-IO#序列化版本号|支持序列化]]。这样在一个系统中序列化后,经过网络传输到达另一个系统时,可以通过反序列化重构对象,在这个系统中也可以使用这个对象。
实际上,整个请求响应的过程都是序列化和反序列化的过程:
请求:
- 浏览器将JS对象序列化为JSON字符串
- 网络传输JSON字符串
- 服务器获取到JSON字符串后反序列化为Java对象
响应:
- 服务器端将Java对象序列化为JSON
- 网络传递JSON字符串
- 浏览器获取到JSON字符串后反序列化为JSON对象
不仅是浏览器-服务器,服务器-服务器之间也需要JSON作为数据传输的载体
JSON的格式
{
"name" : "zhangsan",
"age" : 15,
"hobby" : ["smoke","drink"]
}
JSON规定的格式:
-
"key" : "value"
表示对象的字段,如果value是字符串类型需要加双引号,数值类型可以不加 -
{}
表示 对象、Map、其他符合key-value格式的结构 -
[]
表示 一组对象、一组字符串、一组数值
各个语言都会遵守这个规定,转化为自身的对象结构,比如:
-
{}
代表Java对象/Map,[]
对应Java的数组、List、Set等单列集合 -
{}
代表Python对象/字典,[]
对应Python的元组或list -
{}
代表PHP的对象,[]
对应PHP的Array
JS对象和Java对象属于同一层次,而JSON只是一个字符串,常用在两个节点之间网络传输数据