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






