json的學習筆記_json必知必會
心得:我們看一本關於程式的書,應該帶著一下三個問題來快速瀏覽這本書;
1).它是什麼?
2).我可以用它來幹什麼?
3).那些別有用心的人會用它來幹什麼?
1.資料交換格式是一種在不同平臺間傳遞資料的文字格式.而json是一種資料交換格式,xml也是一種資料交換格式;
2.不是所有的系統都支援使用json來交換資料.
3.json的全稱是:JavaScript Object Notation(javascript物件表示法),資料交換格式是獨立於語言的,與JavaScript無關;
4.表示法是指一個可以表示諸如數字或單詞的字元系統;
5.一種好的資料交換格式必然適用於大多數系統,但也有小部分不適用的系統.這時我們常會用到一個術語:可移植性
6.你可以在鍵(名稱)中使用單引號,但不提倡這樣做;
"Lindsay's animal":"cat"
最好不要這樣做.這時因為json中的名稱-值對是一種對許多系統都十分友好的資料結構,而使用空格和特殊字元(即a~z,1~9除外的其他字元)忽略了可移植性;
例項中的”cat”值是被雙引號包裹的.不過,不同於名稱,值並不總是需要被雙引號包裹,當值是字串時,必須使用雙引號.其他的資料型別不應該被雙引號包裹.
7.
{
title:"this is my tittle.",
body:"this is the body."
}
以上的沒有在名稱的兩邊加上雙引號時,它並不是json,而是一個JavaScript物件.有這種困惑是可以理解的.json是基於JavaScript物件字面量的,所以它們看起來很像.但是JavaScript物件字面量不需要給名稱-值對中的名稱兩邊加上雙引號.而在json中,卻是必須要加的.
8.使用json時,很重要的一點就是驗證.
驗證工具:json formatter,json editor online, jsonLint這些工具是檢驗json的語法的錯誤;還有一種驗證就一致性驗證(以後會說明);
9.json的媒體型別:
MIME型別,它使用”型別/子型別”這種格式來表示.比如我們看見過的text/html;
json的MIME型別是application/json.
題外話:提前學會並使用一樣事物是很有用的,無論實在計算機世界中,還是在現實世界中.
10.json中的字元可以使用Unicode字元構成;
11.json中的轉義:
{
"promo":"say\"Bob's the best!\" at checkout for free 8oz bag of kibble."
}
反斜線會告訴解析器這個雙引號並不意味者字串的結束.一旦解析去將字串裝入記憶體,每一個雙引號前的反斜線都會被移除;
\/ (正斜線)
\b (退格線)
\f (換頁符)
\t (製表符)
\n (換行符)
\r (回車符)
\u (後面跟十六進位制字元(如笑臉表情\u263A)
\\ (反斜線)
對製表符和換行符轉義後的json
{
"story":"\\t Once upon a time, in a far away land \\n there lived a princess."
}
12.指數表示法:
2e+2000
13.json中的布林型別:
在json中,該孜買那隻僅使用小寫形式:true或flase;任何其他形式的寫法都會報錯;
14.json中的null型別:
0 是一個數字.這意味者本質上實在計數;
null用來表示沒有,不存在等意思;
不要把null和undefine混淆,尤其是在jJavaScript中;
15.在json陣列中混合使用資料型別:
{
"eggCarton":[
"egg",
null,
"egg",
"egg",
"egg",
5
]
}
雖然在”大多數語言”中不合法,但在json中,這種混合使用資料型別的情況是合法的.
//////例項15-1///
var temp = 5;
temp = 'renchenhao';
在JavaScript中 用 var 定義一個變數,如15-1中,先把5賦給temp,然後在賦值一個字元創 “renchenhao”,這種做法在JavaScript中是合法的;
但是在大多數語言中國,當宣告一個數組時,也要所有容器中所儲存的資料都應該是什麼型別,且之後不能隨意更改;
理由如上,json是一種資料交換格式.如果將json資料傳遞給一個不使用JavaScript的系統,那麼在解析時很可能會出錯.
在json中物件和陣列另一個關鍵的區別是,陣列中所有的值應具有相同的資料型別.
16.json Schema:
{
//宣告的名稱必須為"$schema",值必須為所用草擬版本的連結;
"$schema":"http://json-schema.org/draft-04/schema#",
"title":"Cat",
//定義屬性,如一隻貓的屬性;
"properties":{
"name":{
"type":"string"
"minLength":3,
"maxLength":20
},
"age":{
"type:"number",
"description":"Your car's age in years.",
"minimum":0
},
"declawed":{
"type":"boolean
}
"dscription":{
"type":"string
}
},
//定義必填欄位;
required":[
"name",
"age",
"declawed"
]
}
//能通過上面驗證的合法的json
{
"name":"Fluffy",
"age":2,
"declawed":false,
"description":"Flufffy loves to sleep all day." //這個欄位可以不填,因為上面的驗證中此欄位不
//是必填欄位
}
我們來看一下可以用於這一模式中的各種重要關鍵字:
關鍵字 | 描述 |
---|---|
title | 用它給我們的模式提供了標題。 |
description | 關於模式的描述。 |
type | type 關鍵字在我們的 JSON 資料上定義了第一個約束:必須是一個 JSON 物件。 |
properties | 定義各種鍵和他們的值型別,以及用於 JSON 檔案中的最小值和最大值。 |
required | 存放必要屬性列表。 |
minimum | 給值設定的約束條件,表示可以接受的最小值。 |
exclusiveMinimum | 如果存在 “exclusiveMinimum” 並且具有布林值 true,如果它嚴格意義上大於 “minimum” 的值則例項有效。 |
maximum | 給值設定的約束條件,表示可以接受的最大值。 |
exclusiveMaximum | 如果存在 “exclusiveMinimum” 並且具有布林值 true,如果它嚴格意義上小於 “maximum” 的值則例項有效。 |
multipleOf | 如果通過這個關鍵字的值分割例項的結果是一個數字則表示緊靠 “multipleOf” 的數字例項是有效的。 |
maxLength | 字串例項字元的最大長度數值。 |
minLength | 字串例項字元的最小長度數值。 |
pattern | 如果正則表示式匹配例項成功則字串例項被認為是有效的。 |
17.json中安全問題:
跨站請求攻擊(CSRF):
1).CSRF攻擊成功的條件:在於攻擊者能夠預測所有的引數從而構造出合法的請求;
2).是一種利用站點對使用者瀏覽器信任而發起攻擊的方式,和xss就不同;
3).要合理的使用get ,post,cookie;
同源指的是:同協議,同域名和同埠。同源策略,簡單地說就是要求動態內容(例如,JavaScript或者VBScript)只能讀取或者修改與之同源的那些HTTP應答和Cookie.而不能讀取來自不同源的內容。瀏覽器的同源策路限制了指令碼只能訪問同源下的資源。
同源策略僅僅阻止了指令碼讀取來自其他站點的內容.但是卻沒有防止指令碼向其他站點發出請求。因為CSRF攻擊是由於某些請求被髮出,而引起在伺服器端執行了某些動作所引起的,所以同源策略無法防止CSRF攻擊。
18.注入攻擊:
跨站指令碼攻擊是注入攻擊的一種;
要知道,json本身僅僅是文字.在程式設計中,如果想要對代表物件的文字進行操作,首先要將他轉換為物件並裝入記憶體中.這樣,它才能被操作,觀察,並在程式邏輯中使用.
eval()函式可以來進行這一個操作:
//獲取物件的屬性;
var jsonString = '{"animal":"cat"}';
var myObject = eval("("+jsonString+")");
alert(myObject.animal);
注意:
eval()函式它會將傳入的字串無差別的執行,如果json被替換為惡意指令碼就危險了;
解決:用JSON.parse()僅會解析json,並不會執行指令碼;
//使用JSON.parse代替eval();
var jsonString ='{"animal":"cat"}';
var myObject =JSON.parse(jsonString);
alert(myObject.animal);
//JSON.parse()函式更加安全.主流瀏覽器已支援;
19.頂層json陣列:
[
{
"user":bobbarker"
},
{
"phone":"555-555-555"
}
]
說明:頂層json陣列是合法的JavaScript程式碼,將陣列存放到物件中去,使其成為非法的JavaScript,這樣就不會被