##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 文件的簡單翻譯
參考資料:
-
php 怎麼解析 JSON 數據:前輩博文
-
JSON 官方信息:http://www.JSON.org/
暫無評論,快來發表你的看法吧