1. 程式人生 > >json的學習筆記_json必知必會

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."   //這個欄位可以不填,因為上面的驗證中此欄位不
  //是必填欄位
}

我們來看一下可以用於這一模式中的各種重要關鍵字:

關鍵字 描述
schema|schema 關鍵字狀態,表示這個模式與 v4 規範草案書寫一致。
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,這樣就不會被