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官方網站:http://json.org/
- 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的對比
- 可讀性: 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的格式必須是陣列或者物件,其屬性支援一下型別:
- boolean: true, false
- number: 0, 1, 2, 3
- string: “abc”
- object: null, {}, {“a”: “b”}
- array: [], [1, 2]
嚴格的語法約束
-
不能有ascii之外的字元,漢字應使用”u6c49″格式;
- 然而在utf-8流行的時代,漢字不編碼已不是啥大問題了;
- 不能有註釋,行註釋與塊註釋都不可以;
- 字串中不能有TAB,使用”t”表示;
- 物件中的所有的key都必須新增雙引號,所有的字串型別的value也都必須是雙引號格式的;
json與js
- 因為JSON源於JS,所以JSON在JS中具有得天獨厚的優勢;
- 因為JS是web環境下B端開發語言的不二之選,所以JSON在WEB中大行其道;
-
優勢:
- JS的語法子集,合法的JSON程式碼在JS中也是合法的JS程式碼,內嵌JSON傳輸隨處可見,jsonp的原理便是基於此前提的;
- 解析JSON資料的成本足夠小,eval,json.js,
JSON.parse(str)
- 各種封裝庫直接透傳json格式,導致json誕生之後迅速取代xml在資料傳輸中的地位;
- JSON序列化在JS中也非常容易,json.js,
JSON.stringify(json/*, null, " "*/);
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:
- JSON-java: JSONXXX.fromObject(str), obj.toString()
JSONObject jsonObj = JSONObject.fromObject(jsonString);
JSONArray jsonArr = JSONArray.fromObject(jsonString);
- google-gson: gson.toJson, gson.fromJson
- JSON-java: JSONXXX.fromObject(str), obj.toString()
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,下面的字元被認為是行終止符:* `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驗證器和格式化工具.