[toc]
JSON必知必會
學習網站:SafariBooksOnline
它是什么?
我可以用它做什么?
那些別有用心的人會用它做什么?
目錄概述:
第1~4章:JSON基礎知識:
語法
語法驗證
數據類型
模式驗證
第5章:研究JSON的安全問題
介紹客戶端和服務端的概念
回答那些別有用心的人會用它做什么
第6~9章:JSON是如何在代碼中使用的
重點介紹了jQuery、AngularJS、CouchDB等技術的進階知識
其他章節: 回答JSON作為數據交換格式所扮演的種種角色,我們可以使用它做什么?
章節目錄
語言的學習并沒有學習編程中通用的概念重要
第一章:什么是JSON?
1.1 JSON是一種數據交換格式
1.2 JSON獨立于編程語言
1.3 專業數據和概念
筆記:
語言的學習并沒有學習編程中通用的概念重要
我們使用JSON,即:我們使用的是一種 基于
對象表示法的 數據交換格式
JSON : JavaScript對象表示法(JavaScript Object Notation)
表示法:一個用于表示諸如數字或單詞等數據的字符系統
數據交換格式:用于在不同系統或者平臺之間交換數據的文本(所追求的重要指標:可移植性)
可移植性:在平臺系統之間傳輸信息的兼容性
第二章:JSON語法
2.1 JSON基于JavaScript對象字面量
- literal釋義
- 英語中 : 字面上的 :是一個形容詞, 用來表示所說的話和所表達的是其字面的意思
- 編程語言中: 字面量 :是一個名詞,是對數據值的具體表示
eg : x = 5 : x 表示變量 5是字面量
- JSON是基于JavaScript 對象字面量的。
注意是基于,原因是:在JavaScript中,對象里面常常包含函數,因此我們不能直接使用JavaScript的對象來表示鞋子具體的屬性,還能創建一個walk函數。而且,數據交換的核心是數據,因此JSON中不會涉及JavaScript對象字面量中的函數。
即:JSON 所基于的JavaScript對象字面量 ,單純是指對象字面量 及其屬性的語法表示,這種屬性的表示方法是通過名稱-值對來實現的。
2.2 名稱 - 值對
"animal" : "cat"
2.3 正確的JSON語法
名稱:始終需要被雙引號包裹。雙引號中的名稱可以是任何有效的字符串。
- 推薦 :
”myAnimal“ : ”cat“
- 合法但是不推薦 :
“My animal” : ”cat“ // 名稱可以包含空格
”Library's animal“ : ”cat“ //名稱可以包含單引號
- 不推薦原因:這樣做降低了JSON數據的可移植性.
- 原因描述:JSON作為一種 基于對象表示法的
數據交換格式
,所追求的重要指標就是可移植性
。
而使用空格和特殊字符(即 az,09除外的字符)忽略了可移植性**.因此,為了獲取最大可移植性,我們應該盡可能的避免使用空格或者特殊字符。
值:并不總是需要被雙引號包裹。
當值是 字符串 的時候,必須 使用雙引號包裹;
當值是 數字 、布爾值、數組、對象、null等其他數據類型的時候,都不應該被雙引號包裹。
構建JSON:了解構建一個對象的語法(騎士冊封儀式 : “JSON先生,我在此封你為對象”)
{
“animal” : "cat",
"color" : "orange"
}
-
從機器角度理解JSON語法
與人不同,機器是完全遵守規則和指令的
。當我們在一個字符創類型外面使用下列字符的時,實際上是告訴機器 : 如何讀取數據 的指令
。- { 開始讀取對象
- } 結束讀取對象
- [ 開始讀取數組
- ] 結束讀取數組
- : 分割 名稱和值
- , 一個新部分的開始
注:
例 1: 不能通過驗證的“JSON
{
title : "This is my titile",
body : "This is my body"
}
錯誤 : 驗證器會拋出一個 解析錯誤。
原因 : 名稱沒有加上雙引號。如果名稱沒有加上雙引號,則表示這是一個JavaScript對象,而不是JSON。
例 2. 不合法的JSON(單引號)
{
‘title’ : ‘This is my titile’,
’body‘ : ’This is my body‘
}
例 3. 合法JSON
{
"title" : "This is my titile",
”body" : "This is my body"
}
2.4 語法驗證
工具:
- JSON Formatter & Validator
- JSON Editor Online
- JSONLint
2.5 JSON文件
*.json文件
2.6 JSON的媒體類型
JSON 的MIME類型是application / json
- 涉及媒體類型時機 : 在傳輸數據時,需要提前告知接收方數據是什么類型,這就涉及媒體類型。
- 媒體類型的別稱:如 互聯網媒體類型、內容類型 或者 MIME類型。
- 表示 : 它使用 “類型/子類型”這種格式來表示,如 :text / html
第三章 JSON數據類型
提前了解并學會使用一樣事物是很有用的,無論是在計算機世界中,還是在現實世界中。
3.1 數據類型簡介
原始數據類型:在不同編程語言中一成不變的數據類型通常叫做原始數據類型。
4.1 數據類型簡介
4.1 數據類型簡介
:原始數據類型*:在不同編程語言中一成不變的數據類型通常叫做原始數據類型。
- 數字
- 整型
- 浮點數
- 定點數 - 字符和字符串
- 布爾類型
3.2 JSON中的數據類型
由于JSON是基于對象字面量表示法 以及 對象數據類型的,你可能覺得讓它作為數據交換格式有點不妥。原因是,數據交換格式:是以讓不同的兩個>系統之間能夠進行交流為目的,這一格式所表達的必須是共有的部分。
記住:復合數據類型對象 的 數據結構 可以 被解構為 原始的數據類型。
因此,即使對于那些不支持對象數據類型的語言來說,一旦這個數據結構能夠被解構為 原生的數據類型,就很好處理了。
JSON中的數據類型
- 對象
- 字符串
- 數字
- 布爾值
- null
- 數組
3.3 JSON中的對象數據類型
{
"person" : {
"name" : "lindsay bassett",
"head" : {
"hair" : {
"color" : "light blond",
"length" : "short"
},
"eyes" : "green"
}
}
}
3.4 JSON中的字符串類型
在JavaScript中,使用單引號或者雙引號沒有區別。然而,JSON不是JavaScript對象字面量,它只是基于JavaScript對象字面量。在JSON中,僅允許使用雙引號包裹字符串。
注意:由于JSON解析器來說` " { } ,[ ] `都是解析的指令,因此對于除了a~z ,A~Z字符構成的字符串,JSON中對于 字符串中 其具有特殊含義 的 字符串 的識別 需要 轉譯。JSON中除了" \
還需要轉譯以下字符:
- \ / (正斜線)
- \ b (退格符)
- \ f (換頁符)
- \ t (制表符)
- \ n (換行符)
- \ r (回車符)
- \ u后面跟十六進制字符 Unicode編碼
3.5 JSON中數字類型
- 整型、浮點
3.6 JSON中的布爾類型
- true / false
3.7 JSON中的null類型
對于 不存在 或者 未定義 的屬性的值,使用 null 來描述。
注意 不要把null 與undefined 混淆
- undefined : 不是JSON中的數據類型。
- 在JavaScript中 :
undefined 與那些 聲明的名稱 和 值 都不存在 的 對象 或者 變量 有關;
null 僅與對象 或 變量 的值有關。null 表示的是一個沒有值的值.JSON中null 必須使用 小寫形式
。
3.8 JSON中的數組類型
- 在JSON中,數組里可以包含任何支持的數據類型。
- JSON 是一種數據交換格式,如果將JSON數據傳遞給一個不使用JavaScript的系統,那么在解析時可能出錯。
3.9 概念
- 對象 和 數組的區別:
- 對象 是 名稱-值對 組成的 列表 或者 集合。
- 數組 是 值 構成的 列表 或者 集合。數組中所有的值都應該具有相同的 數據類型。
第四章 JSON Schema
4.1 驗證的魔力
4.2 JSON Schema 簡介
4.3 專業術語和概念
第五章 JSON中的安全問題
JSON本身不會構成什么威脅,因為本身它就是一種數據交換格式。它不過是一種數據文件或者數據流。真正能產生安全問題的是 JSON的使用。該章節重點討論在
WEB中使用JSON時最常見的兩個安全問題:跨站腳本偽造
和 跨站腳本攻擊
。
5.1 客戶端和服務端的關系
舉例:
- 客戶端 就是發生在瀏覽器中的一切;
- 服務端 則是發生在 運行網站的 服務器 中的一切;
- 關系描述:互聯網瀏覽器(客戶端) 和 網站(服務端) 之間的關系 就像我們去餐廳吃飯時,我們(客戶)和餐廳的關系,這一關系中包含了大量的請求和響應。我們請求的是一份晚餐,廚房的響應則是 將我點的菜做出來,并送到我面前,展示給我們。
-
舉個栗子:
- 假如你正在喜歡的網站上看可愛的小貓的圖片,那么此時
你電腦當上的互聯網瀏覽器就是客戶端,而運行著可愛小貓圖片的網站的電腦 就是 服務端
。你的瀏覽器通過互聯網將你的請求發送給小貓圖片網站的服務器,服務器接著就會把對應的頁面作為響應發送給你。接下來,你的瀏覽器就會將頁面在屏幕上渲染出來。 - 在這一關系中,我們稱
圖片網站返回的即將被瀏覽器處理的響應為
客戶端的代碼;將頁面返回響應傳遞過來之前所發生的事
,稱為服務器代碼。
- 假如你正在喜歡的網站上看可愛的小貓的圖片,那么此時
筆記:
我去餐廳就餐這件事情中:
我是客戶端
餐廳是服務端
我向服務員點餐:
我拿著我餐桌位置的標識,向服務員描述我的需求,服務員在知道我的需求 和 我的置后,拿著我的請求信息向廚房發起一個請求,廚房接收服務員傳遞過來的信
息,經過處理加工,把對應請求內容的食物做好后,由服務員拿著我的位置信息和做好的晚餐,對我剛剛的請求做出一個響應,即:將食物送到我的餐桌上,然后我就能夠享用了。
在這一關系中:
我 是 客戶端,
餐廳 是 服務端,
廚房 是 服務器
我對應的 餐桌 是 客戶端瀏覽器,
服務員 是 互聯網+瀏覽器,
我點的單 是 我通過瀏覽器和互聯網 向 服務器發送的請求
送到我桌子上的餐品 是 服務器給我的響應內容,由客戶端瀏覽器解析后展示給我。
服務器給我的響應內容 是 客戶端代碼
服務器處理請求,得到響應內容,生成響應并發送的過程,稱為 服務器代碼。
5.2 跨站請求偽造
跨站請求偽造,即:CSRF(cross-site request gorgery,讀作sea-surf),是一種利用
站點對用戶瀏覽器的信任
而發起攻擊的方式。CSRF漏洞已經存在了很長時間了,遠比JSON早。
攻擊原理:
- 合法JSON的不合法使用:有些合法的JSON十分危險,因為它也是可以執行的JS腳本。這樣黑客就能夠獲取我們的信息。
例如:頂層JSON數組
(假設該例中的JSON中存儲了你的個人信息)
[
{
"user" : "zhyingjia"
},
{
"phone": "123-123-1236"
}
]
- 瀏覽器 對 不同域名的站點 之間 進行資源分享有一定限制規則。但是使用<script></script標簽能夠繞開這些規則。
例如: 黑客站點的<script>標簽可能是這樣的
<script src = "[https: // www.yourspecialbank.com](https://www.yourspecialbank.com/)/user.json"></script>
- 關鍵:網站之間的信任憑證。
上面描述的攻擊能夠得以實現,很關鍵的一點就是利用了你和網站間的憑證
,沒有你的憑證,<script>中的鏈接是不會返回任何東西的。
原因 :<script>
中的鏈接是一個動態鏈接,會根據登錄用戶的不同,而顯示不同的敏感信息。
當你在網站登錄時,便初始化了一個憑證,網站以此來確定你的身份。
CSRF 就是利用了這一信任關系。黑客為了利用這一信任,需要在你已登錄銀行賬號的情況下訪問其他含有危險 <script>
標簽的網站。要實現這點,他事先會發送大量的偽造郵件,這些郵件會偽造的和你的銀行發來的郵件一模一樣,如果接受者沒有好好查看一下發件人或者郵件中的鏈接是否指向可以信任的網站,那么就很可能點進去。
舉個例子:
如果某一天你生病了或者精神狀態不太好,不小心點開了這個鏈接。
如果,你這時你沒有退出銀行賬號,那么你與銀行之間的會話仍然存在。此時你與銀行之間處于信任關系之中。
如果此時,你進入了壞人的網站,即使你馬上意識到這個網站有點奇怪并且立刻關閉了它,也為時已晚了。
因為黑客已經獲取到了敏感的 JSON 數據并發送發到了自己的服務器并且保存了起來。
那么,如何阻止 CSRF 攻擊呢?
- 避免使用頂層 JSON 數組 :即
將數組存放到對象之中,使其成為非法的 JavaScript ,這樣包含我們敏感數據的數組就不會被 <script> 標簽加載
例如:
{
"info" : [
{
"user" : "zhyingjia"
},
{
"phone": "123-123-1236"
}
]
}
5.3 注入攻擊
5.3.1 跨站腳本攻擊
5.3.2 安全漏洞: 決策上的失誤
5.4 專業術語和概念
第六章 JavaScript中的XMLHttpRequst與Web API
JavaScript中的XMLHttpRequst 與 Web API等概念聽上去好像很難,但其實并沒有那么復雜。它僅僅是一種簡單的客戶端與服務端的關系:JavaScript中的XMLHttpRequest負責在客戶端發起請求,而WebAPI負責在服務端返回響應。
章節內容:上一章節, 我們曾經用餐廳的例子來說明服務端和客戶端,服務端就是廚房,而客戶端是來用餐的人。而和第一章關注的是其中的一類廚房,看看它是如何運作的。
簡述:
1.互聯網瀏覽器發送的是對某個資源的請求。上網時,我們通過點擊一個指向URL的鏈接,或者直接在瀏覽器中輸入URL。我們在瀏覽器中使用的URL通常指向一個HTML資源,它讓我們看到我們的網站。在這種情況下,我們所請求的資源的內容類型是text/html.
2.另一種與我們不直接相關的客戶端-服務端關系是WebAPI。通常情況下,它所需要的是獲取數據。在這一章,我們將著眼于一種請求JSON資源(一種內容為application/json)的客戶端,以及為這類顧客服務的餐廳:Web API.
6.1 WebAPI
Web API 是通過HTTP服務進行交互的一組指令和標準。這些交互可以包括:創建post、讀取get、更新put、刪除delete (CRUD)等操作。
JavaScrip在幕后進行這些操作,例如在某個頁面請求天氣數據,稱為異步操作。
異步操作:通常指發生在幕后的,不會中斷主進程的操作。
JavaScript中的異步操作: "主進程"指的是Web瀏覽器的顯示進程。
例如:某個新聞頁面可能包含一個實時顯示天氣的數據的側邊欄,在閱讀新聞的時候,后臺代碼會每隔60s異步更新顯示數據,而這一操作并不需要刷新頁面,也不會對你閱讀代碼產生任何影響。
**AJAX與AJAJ : **Asynchronous JavaScript and XML/JSON(異步的JavaScript 和 XML/JSON).
6.2 JavaScript中的XMLHttpRequest對象
JavaScript中的XMLHttpRequest:是客戶端主動去獲取資源的代碼。
XMLHttpRequest 描述:能夠使用HTTP協議(超文本傳輸協議),來發送請求的代碼 就是 XMLHttpRequest。
JavaScript中的XMLHttpRequest對象:JavaScript 是一種面向對象語言,而 XMLHttpRequest 就是一類對象。當使用 new XMLHttpRequest() ,并將其返回值賦值給一個變量時,它就具有了從某一地址請求資源的功能。
例:JavaScript中的XMLHttpRequest對象:
var myXmlHttpRequest = new XMLHttpRequest();