跳到主要內容
黯羽輕揚每天積累一點點

JS 學習筆記 9_JSON

免費2015-04-12#JS#json

JSON 是啥,怎麼用,怎麼支持 IE,json.js 內部是怎麼實現的

##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(一個小 術語):

下載地址:https://github.com/douglascrockford/JSON-js/(道格拉斯自己捏的)

說白了就是個小型 js 庫(壓縮之後 4KB 而已),提供 JSON 解析和序列化功能。當然,也可以直接用 JQuery

道格拉斯還提供了額外的 JSON 支持(除基本的 stringify 和 parse 外):

json2.js: 如果不存在內建 JSON 對象的話,會給全域對象添個 JSON 屬性,屬性值是一個對象,有 stringify 和 parse 方法。parse 用的是 eval 方法解析,還用了幾個正則表達式檢測,防止執行非 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 用來表示數據關係

P.S. 上面的是 readme 文件的簡單翻譯

參考資料:

評論

暫無評論,快來發表你的看法吧

提交評論