JSON資料格式及其在WEB開發中的應用

Faremax發表於2018-09-10
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的對比

    1. 可讀性: JSON和XML的可讀性可謂不相上下,一邊是建議的語法,一邊是規範的標籤形式,很難分出勝負。
    2. 可擴充套件性: XML天生有很好的擴充套件性,JSON當然也有,沒有什麼是XML能擴充套件,JSON不能的。
    3. 編碼難度: XML有豐富的編碼工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的編碼明顯比XML容易許多,即使不借助工具也能寫出JSON的程式碼,可是要寫好XML就不太容易了。其實手工拼json其實也是個有挑戰的活兒
    4. 解碼難度: XML的解析得考慮子節點父節點,讓人頭昏眼花,而JSON的解析難度幾乎為0。這一點XML輸的真是沒話說。
    5. 流行度: 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中大行其道;
  • 優勢:

    1. JS的語法子集,合法的JSON程式碼在JS中也是合法的JS程式碼,內嵌JSON傳輸隨處可見,jsonp的原理便是基於此前提的;
    2. 解析JSON資料的成本足夠小,eval,json.js, JSON.parse(str)
    3. 各種封裝庫直接透傳json格式,導致json誕生之後迅速取代xml在資料傳輸中的地位;
    4. 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與其他語言之間的型別對應關係
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驗證器和格式化工具.

相關文章