JSON初識

什麼是JSON

1.JSON是一種數據格式

這裏用一張圖解釋javascript

圖中每一種顏色的圓圈至關於一種語言,例如python,C/C++,Java等,那麼這些不一樣的語言之間如何溝通,如何傳輸數據呢?JSON就至關於遊走於這些島嶼之間的商船,來使說不一樣語言的島嶼的人可以傳遞「商品」,互相溝通。java

2.JSON不是獨立的編程語言

JSON全稱是Javascript Object Notation(JavaScript對象表示法)。從名稱咱們也能過大體瞭解到JSON究竟是什麼,JSON是一種方法,這個方法是來源於JavaScript語言中的,因此JSON不是獨立的編程語言,而是一種在許多編程語言中都能找到共同元素的表達方式。python

JSON語法

1.基於對象字面量

literal(字面量),是對數據值的具體表示。數據交換格式的核心是數據,因此JSON不會涉及到JavaScript對象字面量中的函數web

2.名稱-值對(鍵-值對)

{
	"animal" : "cat",
	"animal" : "dog",
	"animal" : "horse"
}

看上述代碼,一個名稱,一個值,即名稱-值對。編程

3.JSON語法

JSON中的名稱是用雙引號包含(不能夠用單引號!必須用雙引號包含!),裏面能夠包括空格,甚至單引號。JSON的全稱是對象表示法,用花括號包含名稱值對則成爲了一個對象,如:json

{
	"animal" : "cat"
}

多個名稱-值對之間用逗號分隔api

JSON的數據類型

1.數據類型

數據類型和咱們常見的數據類型是相似的數組

  • 整型
  • 浮點型
  • 定點數
  • 字符和字符串
  • 布爾類型
  • 數組

2.JSON中的對象數據類型

嵌套對象的使用瀏覽器

{
	"person" : {
		"name" : "Lindsay Bassett",
		"heightInInches" : 66,
		"head" : {
			"hair" : {
				"color" : "light blond",
				"length" : "short",
				"style" : "A-line"
			},
		"eyes" : "green"
		}
	}
}

3.JSON中字符串類型的使用

當雙引號中出現雙引號時,會被當作是字符串結尾的雙引號。那麼爲了解決這種問題,就須要在字符串前加上反斜線來對其進行轉義,以下所示安全

{
	"what" : "Place say \"I am the best!\" now"
}

可是有時候反斜線反而會引發報錯,好比下面這個例子

{
	"location" : "C:\program Files"
}

這個時候就須要用反斜線來轉義反斜線,以下

{
	"loacation" : "C\\program Files"
}

那麼在json中都有哪些須要轉移的字符呢,有如下幾種

  • /(正斜線)
  • \b(退格符)
  • \f(換頁符)
  • \t(製表符)
  • \n(換行符)
  • \r(回車符)
  • \u後面跟十六進制字符(如\u263A)

4.JSON中的數字類型

以下示例

{
	"num1" : 123,
	"num2" : 11.25,
	"num3" : -1234.54684,
	"num4" : 4.6489e+24
}

5.JSON中的布爾類型

布爾類型就是truefalse

{
	"left" : true,
	"right" : false
}

6.JSON中的null類型

null不能用0來表示,0是數字,因此json中的null必定要用小寫來表示

7.JSON中的數組類型

以下

{
	"nums" : [
		1,
		2,
		3,
		4,
		5,
		6,
		7,
		8,
		9
	]
}

甚至數組中的數據類型能夠是混合的,以下

{
	"mixed" : [
		1,
		2,
		"hello",
		3,
		4,
		null,
		5
	]
}

JSON Schema

1.簡介

書寫示例

{
	"$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就是用來幫助咱們回答下列問題的。

  • 值的數據類型是否正確?
  • 是否包含所須要的數據?
  • 值的形式是否是我須要的?

JSON中的安全問題

1.跨站請求僞造(CSRF)

CSRF是一種利用站點對用戶瀏覽器信任而發起攻擊的方式。那麼JSON如何和安全問題掛鉤呢?

  • 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);

JavaScript中的XMLHttpRequest與Web API

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中包含的函數和屬性

函數:

  • open(method, url, async(可選), user(可選), password(可選))
  • send()

屬性:

  • 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

JSON-P是指帶有padding(內聯)的JSON。可經過JSON-P繞過同源策略。由於scipt標籤不受同源策略影響,以從不一樣域名的服務器上請求JSON

相關文章
相關標籤/搜索