來歷
JSON(JavaScript Object Notation,JAVAScript對象表示法)是一種由道格拉斯·克羅克福特構想和設計、輕量級的數(shù)據(jù)交換語言,該語言以易于讓人閱讀的文字為基礎,用來傳輸由屬性值或者序列性的值組成的數(shù)據(jù)對象。盡管JSON是JavaScript的一個子集,但JSON是獨立于語言的文本格式,并且采用了類似于C語言家族的一些習慣。
JSON 數(shù)據(jù)格式與語言無關,脫胎自JavaScript,但當前很多編程語言都支持 JSON 格式數(shù)據(jù)的生成和解析。JSON 的官方 MIME 類型是 Application/json,文件擴展名是 .json。
JSON
擴展名 .json
互聯(lián)網(wǎng)媒體類型 application/json
類型代碼 TEXT
統(tǒng)一類型標識 public.json
格式類型 數(shù)據(jù)交換
延伸自 JavaScript
標準 RFC 7159, ECMA-404
網(wǎng)站 json.org
簡介
JSON格式是1999年《JavaScript Programming Language, Standard ECMA-262 3rd Edition》的子集合,所以可以在JavaScript以eval()函數(shù)(javascript通過eval()調用解析器)讀入。不過這并不代表JSON無法使用于其他語言,事實上幾乎所有與網(wǎng)頁開發(fā)相關的語言都有JSON函數(shù)庫。
JSON的基本數(shù)據(jù)類型:
- 數(shù)值:十進制數(shù),不能有前導0,可以為負數(shù),可以有小數(shù)部分。還可以用e或者E表示指數(shù)部分。不能包含非數(shù),如NaN。不區(qū)分整數(shù)與浮點數(shù)。JavaScript用雙精度浮點數(shù)表示所有數(shù)值。
- 字符串:以雙引號""括起來的零個或多個Unicode碼位。支持反斜杠開始的轉義字符序列。
- 布爾值:表示為true或者false。
- 值的有序列表(array):有序的零個或者多個值。每個值可以為任意類型。序列表使用方括號[,]括起來。元素之間用逗號,分割。形如:[value, value]
- 對象(object):一個無序的“鍵-值對”(pair),其中鍵是字符串。建議但不強制要求對象中的鍵是獨一無二的。對象以花括號{開始,并以}結束。鍵-值對之間使用逗號分隔。鍵與值之間用冒號:分割。
- null類型:值寫為null
token(6種標點符號、字符串、數(shù)值、3種字面量)之間可以存在有限的空白符并被忽略。四個特定字符被認為是空白符:空格符、水平制表符、回車符、換行符。空白符不能出現(xiàn)在token內(nèi)部(但空格符可以出現(xiàn)在字符串內(nèi)部)。JSON標準不允許有字節(jié)序掩碼,不提供注釋的句法。 一個有效的JSON文檔的根節(jié)點必須是一個對象或一個數(shù)組。
JSON交換時必須編碼為UTF-8。[1]轉義序列可以為:“\”、“"”、“/”、“b”、“f”、“n”、“r”、“t”,或Unicode16進制轉義字符序列(\u后面跟隨4位16進制數(shù)字)。對于不在基本多文種平面上的碼位,必須用UTF-16代理對(surrogate pair)表示,例如對于Emoji字符U+1F602 face with tears of joy在JSON中應表示為:
{ "face": "" } // or { "face": "\uD83D\uDE02" }
應用領域
WEB開發(fā)
JSON最開始被廣泛的應用于WEB應用的開發(fā)。不過當前JSON使用在JavaScript、Java、Node.js應用的情況比較多,php、C#等開發(fā)的WEB應用主要還是使用XML。
NoSQL數(shù)據(jù)庫
相對于傳統(tǒng)的關系型數(shù)據(jù)庫,一些基于文檔存儲的NoSQL非關系型數(shù)據(jù)庫選擇JSON作為其數(shù)據(jù)存儲格式,比較出名的產(chǎn)品有:MongoDB、CouchDB、RavenDB等。
安全問題
讀取JSON
由于JSON是JavaScript的子集,所以一般都會使用eval()作為讀取數(shù)據(jù)的方式,如果是針對可靠的數(shù)據(jù)來源,在不支持原生JSON解析的瀏覽器上面這是最快速的方法。然而由于eval方法同樣可以執(zhí)行任意的JavaScript代碼,因此當數(shù)據(jù)來源不可靠時則可能產(chǎn)生安全問題。如下面的例子,直接用eval執(zhí)行時會跳轉:
var json= eval("{message:(function (){ window.location='http://zh.wikipedia.org/wiki/JSON#.E5.AE.89.E5.85.A8.E6.80.A7.E5.95.8F.E9.A1.8C'; })()}");
其中一種防止不安全代碼出現(xiàn)的解決辦法,是通過瀏覽器原生支持的JSON.parse(str)方法讀取JSON數(shù)據(jù),當前已經(jīng)得到大部分主流瀏覽器的支持(IE8+,F(xiàn)irefox 3.5+,Chrome4+/Safari4+,Opera10+),在不支持原生JSON對象的瀏覽器上面可以使用parseJSON方法進行讀取[2],parseJSON采用解析器驗證讀入的代碼是否真的是JSON代碼,這樣就更安全。但由于這是用模擬的方式讀取,速度上會比eval()慢。
跨站訪問問題
另外一個安全上的問題則是跨站請求偽造(Cross-site request forgery,簡稱CSRF或XSRF)。這個問題在Javascript中的狀況是,由于Javascript采用了稱為“沙盒”的機制,這種機制限制Javascript引擎僅能引入同一個站點的代碼,因而某種程度上提高了安全性。