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ì)比
- 可讀性: JSON和XML的可讀性可謂不相上下痊剖,一邊是建議的語(yǔ)法,一邊是規(guī)范的標(biāo)簽形式垒玲,很難分出勝負(fù)陆馁。
- 可擴(kuò)展性: XML天生有很好的擴(kuò)展性,JSON當(dāng)然也有合愈,沒(méi)有什么是XML能擴(kuò)展叮贩,JSON不能的。
- 編碼難度: XML有豐富的編碼工具佛析,比如Dom4j益老、JDom等,JSON也有json.org提供的工具寸莫,但是JSON的編碼明顯比XML容易許多捺萌,即使不借助工具也能寫(xiě)出JSON的代碼,可是要寫(xiě)好XML就不太容易了膘茎。其實(shí)手工拼json其實(shí)也是個(gè)有挑戰(zhàn)的活兒
- 解碼難度: XML的解析得考慮子節(jié)點(diǎn)父節(jié)點(diǎn)桃纯,讓人頭昏眼花,而JSON的解析難度幾乎為0披坏。這一點(diǎn)XML輸?shù)恼媸菦](méi)話說(shuō)态坦。
- 流行度: 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)證器和格式化工具.