JS學習筆記9_JSON
1.JSON概述 JavaScript Object Natation,js對象標記法,(像XML一樣)是一種資料格式,它與js有相同的文法形式 P.S.一點小曆史:JSON之父是道格拉斯,《JavaScript語言精粹》的作者,創造JSON的靈感來自js中的字面量標記法 2.JSON文法 1.表示簡單值 例如3, “str”, null, false等等,不支援undefined,而且字串必須用雙引號(JSON裡沒有單引號表示字串的用法,這與js不同) 2.表示對象 與js對象字面量類似,但 沒有變數聲明 沒有末尾分號 屬性名稱必須用雙引號包裹(很容易錯寫成單引號或者忘記用引號) 例如: { "name" : "ayqy", "sex" : "M", "nextSibling" : { "name" : "xxx", "sex" : "M", "nextSibling" : null }}3.表示數組 與數組字面量類似,但 沒有變數聲明 沒有末尾分號 例如: [3, 6, false, "ayqy", {"name" : "xxx", "age" : 18}]4.複雜資料結構 數組和對象之間可以通過嵌套來創造更複雜的資料結構,例如: [ 1, { "extra" : [ 6, { "id" : 5, "attr" : "value" }, false ], "index" : 1001 }, 2]3.序列化(js對象轉JSON) [IE8+]和其它主流瀏覽器有內建JSON對象,可以調用原生方法來序列化js對象: JSON.stringify(obj);//按照預設規則序列化,值為undefined和值為函數的屬性將被忽略JSON.stringify(obj, arr/fun(key, value));//支援過濾一部分屬性(只保留arr中列出的屬性或者用fun來過濾)JSON.stringify(obj, null, num/strPrefix);//支援格式化,自動換行並每級縮排num個空格或者每級添加一個首碼串對於[IE7-]如何支援,我們稍後再議 4.解析(JSON轉js對象) JSON.parse(str);//直接解析JSON.parse(str, fun(key, value));//按fun解析對於[IE7-]如何支援,我們稍後再議 5.跨瀏覽器的JSON序列化/解析 對於不支援JSON對象的瀏覽器可以用一個shim(一個小術語): 說白了就是個小型js庫(壓縮之後4KB而已),提供JSON解析和序列化功能。當然,也可以直接用JQuery 道格拉斯還提供了額外的JSON支援(除基本的stringify和parse外): json2.js: 如果不存在內建JSON對象的話,會給全域對象添個JSON屬性,屬性值是一個對象,有stringify和parse方法。parse用的是eval方法解析,還用了幾個Regex檢測,防止執行非JSON代碼。在現代瀏覽器中這個js檔案啥也不做,原生支援優先。如果不是要支援[IE8-]的話,就不要用這個,也就是說這個檔案並不是必須的。 json.js: 本檔案包含json2.js的所有功能,還給Object的原型添了toJSONString方法和parseJSON方法,建議不要用。 json_parse.js: 本檔案給了parse函數的另一種實現:用遞迴下降(P.S.文法分析器。。好吧,道格拉斯大爺戰鬥力略強)代替了eval函數 json_parse_state.js: 本檔案給了parse函數的另一種實現:用狀態機器(P.S.。。。)代替了eval函數 cycle.js: 本檔案有兩個函數:JSON.decycle和JSON.retrocycle,用來消除/恢複JSON中的環和圖結構,JSONPath用來表示資料關係