JSON是什麼?
- JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,採用徹底獨立於語言的文本格式,是理想的數據交換格式。同時,JSON是 JavaScript 原生格式,這意味着在 JavaScript 中處理 JSON數據不須要任何特殊的 API 或工具包。
- RFC: http://www.rfc-editor.org/rfc...
JSON的歷史
- 在2001年,JSON被道格拉斯•克羅克福德(Douglas Crockford)建立,並在RFC4627與IETF(因特網工程任務組)標準中被規定;詳情見 http://tools.ietf.org/html/rf...。根據規範,JSON的IANA(互聯網數字分配機構)媒體類型是application/json,文件類型是json。
- 它基於JavaScript語言,是在JavaScript的數組(array)和對象(object)基礎上發展而來;
- 道格拉斯從JS語言中發現的(也能夠說是他創造出來的),比當時流行的XML數據傳輸要優越;
- JSON是語言無關的,支持語言以下
- 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),是指一種建立交互式網頁應用的網頁開發技術;
- 雖然 Ajax 先出來了,可是目前先後端的ajax通信幾乎都是json格式的了。
json與xml
-
JSON 和 XML的對比php
- 可讀性: JSON和XML的可讀性可謂不相上下,一邊是建議的語法,一邊是規範的標籤形式,很難分出勝負。
- 可擴展性: XML天生有很好的擴展性,JSON固然也有,沒有什麼是XML能擴展,JSON不能的。
- 編碼難度: XML有豐富的編碼工具,好比Dom4j、JDom等,JSON也有json.org提供的工具,可是JSON的編碼明顯比XML容易許多,即便不借助工具也能寫出JSON的代碼,但是要寫好XML就不太容易了。其實手工拼json其實也是個有挑戰的活兒
- 解碼難度: XML的解析得考慮子節點父節點,讓人頭昏眼花,而JSON的解析難度幾乎爲0。這一點XML輸的真是沒話說。
- 流行度: XML已經被業界普遍的使用,而JSON纔剛剛開始,可是在Ajax這個特定的領域,將來的發展必定是XML讓位於JSON。
json與xml互相轉換
JSON的格式必須是數組或者對象,其屬性支持一下類型:html
- boolean: true, false
- number: 0, 1, 2, 3
- string: "abc"
- object: null, {}, {"a": "b"}
- array: [], [1, 2]
嚴格的語法約束
json與js
- 由於JSON源於JS,因此JSON在JS中具備得天獨厚的優點;
- 由於JS是web環境下B端開發語言的不二之選,因此JSON在WEB中大行其道;
-
優點:node
- JS的語法子集,合法的JSON代碼在JS中也是合法的JS代碼,內嵌JSON傳輸隨處可見,jsonp的原理即是基於此前提的;
- 解析JSON數據的成本足夠小,eval,json.js,
JSON.parse(str)
- 各類封裝庫直接透傳json格式,致使json誕生以後迅速取代xml在數據傳輸中的地位;
- JSON序列化在JS中也很是容易,json.js,
JSON.stringify(json/*, null, "\t"*/);
eval解析json問題:
var str = "{\"name\":\"value\"}";
// 方法1
var json = eval("(" + str + ")"); // 存在諸如 XSS 攻擊風險
// 方法2
var json;
eval("json = " + str);
JSON在其餘語言中的序列化問題
- 這裏不說解析(反序列化),只要是"合法的"JSON數據,解析庫使用的正確,而且兩者相匹配,不該該有問題;
- 關於格式化問題:格式化是爲了方便調試,生產環境中,應避免使用;
- 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:web
JSON與其餘語言之間的類型對應關係
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 |
數據類型問題爲什麼如此重要?
- 弱類型語言不表明沒有類型
- 最新的JS引擎(V8等),約束類型有利於性能
- 讓數據傳輸協議無歧義,簡化約定
- 讓兩端的代碼處理邏輯簡化,避免各類異常的問題
- 嚴格遵照類型約定,能夠規避不少容易被忽視的問題
- 想想各類二進制的數據傳輸協議,類型不是它們特有的
嚴格來講,JSON不是JavaScript的子集;
- JSON: 不要誤會,我真的不是JavaScript的子集
-
"\u2028
",LINE SEPARATOR,下面的字符被認爲是行終止符:json
* `\u000A` - Line Feed
* `\u000D` - Carriage Return
* `\u2028` - Line Separator
* `\u2029` - Paragraph separator
- 正由於這兩個不可見的Unicode字符,JSON便不是JavaScript的一個子集了,就差了這麼一點點;
JSON的高階應用
- JSONP(JSON with Padding)是JSON的一種「使用模式」,可用於解決主流瀏覽器的跨域數據訪問的問題。
- MongoDB底層存儲爲JSON格式;
- JSONiq是個構建在XQuery之上的新型查詢語言。相似於SQL或是LINQ,它提供了諸如let、for、where、group by與select等語法支持概念;
- JSONSelect http://jsonselect.org JSONSelect是一個實驗性的JSON選擇語言, 她很容易從複雜的JSON文檔中訪問數據, 看上去就跟CSS同樣.
- JSONiq http://www.jsoniq.org JSONiq是一個小型而簡潔的XQuery語言擴展來提供JSON支持
- JsonML http://www.jsonml.org JsonML(JSON標記語言)是應用程序的JSON格式. 它使用基本的JSON數據格式機制並將其應用於XML的表示.
- JSON-RPC http://json-rpc.org JSON-RPC是相似於XML-RPC的輕量級遠程過程調用(Remote Procedure Call), 它是爲簡潔而生的.
- JSONLint http://jsonlint.com JSONLint是一個JSON驗證器和格式化工具.