這裏用一張圖解釋javascript
圖中每一種顏色的圓圈至關於一種語言,例如python,C/C++,Java等,那麼這些不一樣的語言之間如何溝通,如何傳輸數據呢?JSON就至關於遊走於這些島嶼之間的商船,來使說不一樣語言的島嶼的人可以傳遞「商品」,互相溝通。java
JSON全稱是Javascript Object Notation(JavaScript對象表示法)。從名稱咱們也能過大體瞭解到JSON究竟是什麼,JSON是一種方法,這個方法是來源於JavaScript語言中的,因此JSON不是獨立的編程語言,而是一種在許多編程語言中都能找到共同元素的表達方式。python
literal(字面量),是對數據值的具體表示。數據交換格式的核心是數據,因此JSON不會涉及到JavaScript對象字面量中的函數web
{ "animal" : "cat", "animal" : "dog", "animal" : "horse" }
看上述代碼,一個名稱,一個值,即名稱-值對。編程
JSON中的名稱是用雙引號包含(不能夠用單引號!必須用雙引號包含!),裏面能夠包括空格,甚至單引號。JSON的全稱是對象表示法,用花括號包含名稱值對則成爲了一個對象,如:json
{ "animal" : "cat" }
多個名稱-值對之間用逗號分隔api
數據類型和咱們常見的數據類型是相似的數組
嵌套對象的使用瀏覽器
{ "person" : { "name" : "Lindsay Bassett", "heightInInches" : 66, "head" : { "hair" : { "color" : "light blond", "length" : "short", "style" : "A-line" }, "eyes" : "green" } } }
當雙引號中出現雙引號時,會被當作是字符串結尾的雙引號。那麼爲了解決這種問題,就須要在字符串前加上反斜線來對其進行轉義,以下所示安全
{ "what" : "Place say \"I am the best!\" now" }
可是有時候反斜線反而會引發報錯,好比下面這個例子
{ "location" : "C:\program Files" }
這個時候就須要用反斜線來轉義反斜線,以下
{ "loacation" : "C\\program Files" }
那麼在json中都有哪些須要轉移的字符呢,有如下幾種
以下示例
{ "num1" : 123, "num2" : 11.25, "num3" : -1234.54684, "num4" : 4.6489e+24 }
布爾類型就是true
和false
{ "left" : true, "right" : false }
null不能用0來表示,0是數字,因此json中的null必定要用小寫來表示
以下
{ "nums" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] }
甚至數組中的數據類型能夠是混合的,以下
{ "mixed" : [ 1, 2, "hello", 3, 4, null, 5 ] }
書寫示例
{ "$schema" : "http://www.jlx-love.com/schema#", "title" : "cat", "properties" : { "name" : { "type" : "string" }, "age" : { "type" : "number", "description" : "Your cat's age in years." }, "declawed" : { "type" : "boolean" } }, "required" : [ "name", "age", "declawed" ] }
首先聲明的名稱必須是"$schema"
,值必須得是一個連接。
以表示一個貓爲例,第二個咱們寫的是title
第三個是貓的屬性
第四個是必填字段數組,就是你傳一個數據,這個數組裏的東西你是必定要有的。
因此,schema究竟是幹什麼的?schema就是用來幫助咱們回答下列問題的。
CSRF是一種利用站點對用戶瀏覽器信任而發起攻擊的方式。那麼JSON如何和安全問題掛鉤呢?
[ { "user" : "bobbarker" }, { "phone" : "111-222-3333" } ]
上述代碼狀況並無在最外面加花括號,這種狀況叫作頂層JSON數組。但也正由於這種使用方式,使得咱們能夠利用它。關於跨站請求僞造這裏不詳細闡述。主要利用過程就是取得網站的信任。其實就是取得了你和網站之間的憑證,而後裏利用你的憑證就能夠登陸網站。
解決這種安全隱患能夠將數組存放到對象之中,使其成爲非法的JavaScript,這樣就不會被script
標籤加載。
{ "info" : [ { "user" : "bobbarker" }, { "phone" : "111-222-3333" } ] }
再者咱們須要用戶使用POST請求獲取數據,進制GET請求。由於GET請求數據會直接得到script
標籤
跨站腳本攻擊(XSS)。JSON自己僅僅只是一段文本。若是要對對象的文本進行操做,就必須首先將文本轉換成對象並裝入內存中。在JavaScript中,可使用eval()函數來完成這一操做。該函數獲取一段字符串,並對其進行編譯和執行。
被eval()函數執行的alert:
var jsonString = "alert('this is bad')"; var my0bject = eval("(" + jsonString + ")"); alert(my0bject.animal);
解決方法使用JSON.parse()函數。由於該函數僅僅解析JSON,而並不會執行腳本
var jsonString = '{"animal" : "cat"}'; var my0bject = JSON.parse(jsonString); alert(my0bject.animal);
XMLHttpRequest負責在客戶端發起請求,Web API負責在服務端發返回響應。Web API是經過HTTP服務進行交互的一組指令和標準,這些交互能夠包括建立,讀取,更新,刪除等操做。
PayOal API的一張JSON發票
{ "merchant_info" : { "email" : "amengsec@qq.com", "first_name" : "ameng", "last_name" : "sec", "business_name" : "Amengsec", "phone" : { "country_code" : "086", "national_number" : "12345678912" }, "address" : { "line1" : "123 qwe", "city" : "Somewhere", "state" : "OR", "postal_code" : "97520", "country_code" : "CN" } }, "billing_info" : [ { "email" : "amengsec@qq.com" } ], "items" : [ { "name" : "Widgets", "quantity" : 20, "unit_price" : { "currency" : "CNY", "value" : 100 } } ], "note" : "Special Widgets Order!", "payment_term" : { "term_type" : "NET_45" }, "shipping_info" : { "first_name" : "asd", "last_name" : "qwe", "business_name" : "Not applicable", "address" : { "line1" : "456 qweqwrfas", "city" : "Somewhere", "state" : "OR", "postal_code" : "97501", "country_code" : "CN" } } }
XMLHttpRequest中包含的函數和屬性
函數:
屬性:
onreadystatechange
能夠在代碼中爲它賦值一個函數
readyState
返回一個0-4的值,用來表示狀態碼
status
返回HTTP狀態碼
responseText
當請求成功時,該屬性會包含做爲文本的響應體
屬性的值能夠是一個函數!由於JavaScript中的含糊也是一類對象。對象是一類數據,所以它能夠被賦值給一個變量(屬性),修改和傳遞
對象的序列化和反序列化:
// JSON響應的反序列化 var my0bject = JSON.parse(myXMLHttpRequest.reponseText); // 對象的序列化 var myJSON = JSON.stringify(my0bject);
創建一個JSON請求併發送:
myXMLHttpRequest.open("GET", url, true); myXMLHttpRequest.send();
JSON-P是指帶有padding(內聯)的JSON。可經過JSON-P繞過同源策略。由於scipt
標籤不受同源策略影響,以從不一樣域名的服務器上請求JSON