JSON數(shù)據(jù)格式及其在WEB開(kāi)發(fā)中的應(yīng)用

JSON是什么说榆?
  • JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式喉誊,采用完全獨(dú)立于語(yǔ)言的文本格式渔隶,是理想的數(shù)據(jù)交換格式羔挡。同時(shí)洁奈,JSON是 JavaScript 原生格式,這意味著在 JavaScript 中處理 JSON數(shù)據(jù)不需要任何特殊的 API 或工具包绞灼。
  • RFC: http://www.rfc-editor.org/rfc/rfc4627.txt
JSON的歷史
  • 在2001年利术,JSON被道格拉斯?克羅克福德(Douglas Crockford)創(chuàng)建,并在RFC4627與IETF(因特網(wǎng)工程任務(wù)組)標(biāo)準(zhǔn)中被規(guī)定低矮;詳情見(jiàn) http://tools.ietf.org/html/rfc4627印叁。根據(jù)規(guī)范,JSON的IANA(互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))媒體類型是application/json军掂,文件類型是json轮蜕。
  • 它基于JavaScript語(yǔ)言,是在JavaScript的數(shù)組(array)和對(duì)象(object)基礎(chǔ)上發(fā)展而來(lái);
  • 道格拉斯從JS語(yǔ)言中發(fā)現(xiàn)的(也可以說(shuō)是他創(chuàng)造出來(lái)的)良姆,比當(dāng)時(shí)流行的XML數(shù)據(jù)傳輸要優(yōu)越肠虽;
JSON官方網(wǎng)站:http://json.org/
  • JSON是語(yǔ)言無(wú)關(guān)的,支持語(yǔ)言如下
  • 8th,ABAP,Ada,AdvPL,ASP,AWK,Bash,BlitzMax,C,C++,C#,Ciao,Clojure,Cobol,ColdFusion,
  • D,Dart,Delphi,E,Fantom,FileMaker,Fortran,Go,Groovy,Haskell,Java,JavaScript,LabVIEW,Lisp,LiveCode,LotusScript,LPC,Lua
  • M,Matlab,Net.Data,Nim,Objective C,OCaml,PascalScript,Perl,Photoshop,PHP,PicoLisp,Pike,PL/SQL,PowerShell,PureBasic,Puredata,Python,
  • R,Racket,Rebol,RPG,Rust,Ruby,Scheme,Squeak,Symbian,Tcl,Visual Basic,Visual FoxPro
json與ajax
  • Ajax 即“Asynchronous Javascript And XML”(異步 JavaScript 和 XML)玛追,是指一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開(kāi)發(fā)技術(shù);
  • 雖然 Ajax 先出來(lái)了,但是目前前后端的ajax通訊幾乎都是json格式的了闲延。
json與xml
  • JSON 和 XML的對(duì)比
    1. 可讀性: JSON和XML的可讀性可謂不相上下痊剖,一邊是建議的語(yǔ)法,一邊是規(guī)范的標(biāo)簽形式垒玲,很難分出勝負(fù)陆馁。
    2. 可擴(kuò)展性: XML天生有很好的擴(kuò)展性,JSON當(dāng)然也有合愈,沒(méi)有什么是XML能擴(kuò)展叮贩,JSON不能的。
    3. 編碼難度: XML有豐富的編碼工具佛析,比如Dom4j益老、JDom等,JSON也有json.org提供的工具寸莫,但是JSON的編碼明顯比XML容易許多捺萌,即使不借助工具也能寫(xiě)出JSON的代碼,可是要寫(xiě)好XML就不太容易了膘茎。其實(shí)手工拼json其實(shí)也是個(gè)有挑戰(zhàn)的活兒
    4. 解碼難度: XML的解析得考慮子節(jié)點(diǎn)父節(jié)點(diǎn)桃纯,讓人頭昏眼花,而JSON的解析難度幾乎為0披坏。這一點(diǎn)XML輸?shù)恼媸菦](méi)話說(shuō)态坦。
    5. 流行度: XML已經(jīng)被業(yè)界廣泛的使用,而JSON才剛剛開(kāi)始棒拂,但是在Ajax這個(gè)特定的領(lǐng)域伞梯,未來(lái)的發(fā)展一定是XML讓位于JSON。
json與xml互相轉(zhuǎn)換

JSON的格式必須是數(shù)組或者對(duì)象,其屬性支持一下類型:

  • boolean: true, false
  • number: 0, 1, 2, 3
  • string: "abc"
  • object: null, {}, {"a": "b"}
  • array: [], [1, 2]
嚴(yán)格的語(yǔ)法約束
  • 不能有ascii之外的字符壮锻,漢字應(yīng)使用"\u6c49"格式琐旁;
    • 然而在utf-8流行的時(shí)代,漢字不編碼已不是啥大問(wèn)題了猜绣;
  • 不能有注釋灰殴,行注釋與塊注釋都不可以;
  • 字符串中不能有TAB掰邢,使用"\t"表示牺陶;
  • 對(duì)象中的所有的key都必須添加雙引號(hào),所有的字符串類型的value也都必須是雙引號(hào)格式的辣之;
json與js
  • 因?yàn)镴SON源于JS掰伸,所以JSON在JS中具有得天獨(dú)厚的優(yōu)勢(shì);
  • 因?yàn)镴S是web環(huán)境下B端開(kāi)發(fā)語(yǔ)言的不二之選怀估,所以JSON在WEB中大行其道狮鸭;
  • 優(yōu)勢(shì):
    1. JS的語(yǔ)法子集,合法的JSON代碼在JS中也是合法的JS代碼多搀,內(nèi)嵌JSON傳輸隨處可見(jiàn)歧蕉,jsonp的原理便是基于此前提的;
    2. 解析JSON數(shù)據(jù)的成本足夠小康铭,eval惯退,json.js, JSON.parse(str)
    3. 各種封裝庫(kù)直接透?jìng)鱦son格式,導(dǎo)致json誕生之后迅速取代xml在數(shù)據(jù)傳輸中的地位从藤;
    4. JSON序列化在JS中也非常容易催跪,json.js,JSON.stringify(json/*, null, "\t"*/);
eval解析json問(wèn)題:
var str = "{\"name\":\"value\"}";
// 方法1
var json = eval("(" + str + ")");   // 存在諸如 XSS 攻擊風(fēng)險(xiǎn)
// 方法2
var json;
eval("json = " + str);
JSON在其他語(yǔ)言中的序列化問(wèn)題
  • 這里不說(shuō)解析(反序列化)夷野,只要是"合法的"JSON數(shù)據(jù)懊蒸,解析庫(kù)使用的正確,并且二者相匹配扫责,不應(yīng)該有問(wèn)題榛鼎;
  • 關(guān)于格式化問(wèn)題:格式化是為了方便調(diào)試,生產(chǎn)環(huán)境中鳖孤,應(yīng)避免使用者娱;
  • nodejs: 和瀏覽器中基本一致;
  • PHP: json_encode,json_decode(PHP 5 >= 5.2.0, PECL json >= 1.2.0)
  • Ruby: @json = @data.to_json, @data = JSON.parse(json)
  • Java:
    • JSON-java: JSONXXX.fromObject(str), obj.toString()

      JSONObject jsonObj = JSONObject.fromObject(jsonString);
      JSONArray jsonArr = JSONArray.fromObject(jsonString);

    • google-gson: gson.toJson, gson.fromJson

JSON與其他語(yǔ)言之間的類型對(duì)應(yīng)關(guān)系
json js php ruby java
boolean boolean boolean true,false boolean
number number integer, float Integer, Float int, float, double
string string string String String
array Array Array Array []
object Object Array Hash Object(from class)
null null null Nil null
數(shù)據(jù)類型問(wèn)題為何如此重要?
  • 弱類型語(yǔ)言不代表沒(méi)有類型
  • 最新的JS引擎(V8等)苏揣,約束類型有利于性能
  • 讓數(shù)據(jù)傳輸協(xié)議無(wú)歧義黄鳍,簡(jiǎn)化約定
  • 讓兩端的代碼處理邏輯簡(jiǎn)化,避免各種異常的問(wèn)題
  • 嚴(yán)格遵守類型約定平匈,可以規(guī)避很多容易被忽視的問(wèn)題
  • 想一想各種二進(jìn)制的數(shù)據(jù)傳輸協(xié)議框沟,類型不是它們特有的
嚴(yán)格來(lái)說(shuō)藏古,JSON不是JavaScript的子集;
  • JSON: 不要誤會(huì),我真的不是JavaScript的子集
  • "\u2028",LINE SEPARATOR忍燥,下面的字符被認(rèn)為是行終止符:
    • \u000A - Line Feed
    • \u000D - Carriage Return
    • \u2028 - Line Separator?
    • \u2029 - Paragraph separator
  • 正因?yàn)檫@兩個(gè)不可見(jiàn)的Unicode字符拧晕,JSON便不是JavaScript的一個(gè)子集了,就差了這么一點(diǎn)點(diǎn)梅垄;
JSON的高階應(yīng)用
  • JSONP(JSON with Padding)是JSON的一種“使用模式”厂捞,可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問(wèn)的問(wèn)題。
  • MongoDB底層存儲(chǔ)為JSON格式;
  • JSONiq是個(gè)構(gòu)建在XQuery之上的新型查詢語(yǔ)言队丝。類似于SQL或是LINQ靡馁,它提供了諸如let、for机久、where臭墨、group by與select等語(yǔ)法支持概念;
  • JSONSelect http://jsonselect.org JSONSelect是一個(gè)實(shí)驗(yàn)性的JSON選擇語(yǔ)言, 她很容易從復(fù)雜的JSON文檔中訪問(wèn)數(shù)據(jù), 看上去就跟CSS一樣.
  • JSONiq http://www.jsoniq.org JSONiq是一個(gè)小型而簡(jiǎn)潔的XQuery語(yǔ)言擴(kuò)展來(lái)提供JSON支持
  • JsonML http://www.jsonml.org JsonML(JSON標(biāo)記語(yǔ)言)是應(yīng)用程序的JSON格式. 它使用基本的JSON數(shù)據(jù)格式機(jī)制并將其應(yīng)用于XML的表示.
  • JSON-RPC http://json-rpc.org JSON-RPC是類似于XML-RPC的輕量級(jí)遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call), 它是為簡(jiǎn)潔而生的.
  • JSONLint http://jsonlint.com JSONLint是一個(gè)JSON驗(yàn)證器和格式化工具.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膘盖,隨后出現(xiàn)的幾起案子胧弛,更是在濱河造成了極大的恐慌,老刑警劉巖侠畔,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叶圃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡践图,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門沉馆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)码党,“玉大人,你說(shuō)我怎么就攤上這事斥黑∫九蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵锌奴,是天一觀的道長(zhǎng)兽狭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鹿蜀,這世上最難降的妖魔是什么箕慧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮茴恰,結(jié)果婚禮上颠焦,老公的妹妹穿的比我還像新娘。我一直安慰自己往枣,他們只是感情好伐庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布粉渠。 她就那樣靜靜地躺著,像睡著了一般圾另。 火紅的嫁衣襯著肌膚如雪霸株。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天集乔,我揣著相機(jī)與錄音去件,去河邊找鬼。 笑死饺著,一個(gè)胖子當(dāng)著我的面吹牛箫攀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幼衰,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼靴跛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了渡嚣?” 一聲冷哼從身側(cè)響起梢睛,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎识椰,沒(méi)想到半個(gè)月后绝葡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腹鹉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年藏畅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片功咒。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愉阎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出力奋,到底是詐尸還是另有隱情榜旦,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布景殷,位于F島的核電站溅呢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猿挚。R本人自食惡果不足惜咐旧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亭饵。 院中可真熱鬧休偶,春花似錦、人聲如沸辜羊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至碱妆,卻和暖如春肉盹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疹尾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工上忍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纳本。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓窍蓝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親繁成。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吓笙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)巾腕,斷路器面睛,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 前端開(kāi)發(fā)者丨h(huán)ttp請(qǐng)求 https:www.rokub.com 前言見(jiàn)解有限, 如有描述不當(dāng)之處尊搬, 請(qǐng)幫忙指出叁鉴,...
    麋鹿_720a閱讀 10,913評(píng)論 11 31
  • 閑來(lái)無(wú)事,了解一下ps的基本操作佛寿,同事也很期待后面會(huì)做出酷炫的動(dòng)畫(huà)效果幌墓,666。冀泻。克锣。 快捷鍵: 基本工具一: 移動(dòng)...
    codingQi閱讀 773評(píng)論 0 1
  • 在生活中,我們可以看到一些人說(shuō)話言之鑿鑿腔长,有理有據(jù),令人信服验残。在工作中捞附,無(wú)需焦頭爛額,加班加點(diǎn)您没,也總是能夠高效完滿...
    yuerfei閱讀 286評(píng)論 0 0
  • “來(lái)來(lái)來(lái)邁爾斯鸟召,我們來(lái)看看假期去哪里玩!”帕克興奮地拿著筆記本電腦坐到邁爾斯身邊氨鹏。 邁爾斯此時(shí)正在客廳沙發(fā)上整理采...
    南呂婁未閱讀 734評(píng)論 1 1