請求: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只是一個字串,常用在兩個節點之間網路傳輸資料