JSON數據格式及其在WEB開發中的應用

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的對比php

    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的格式必須是數組或者對象,其屬性支持一下類型:html

  • boolean: true, false
  • number: 0, 1, 2, 3
  • string: "abc"
  • object: null, {}, {"a": "b"}
  • array: [], [1, 2]
嚴格的語法約束
  • 不能有ascii以外的字符,漢字應使用"u6c49"格式;java

    • 然而在utf-8流行的時代,漢字不編碼已不是啥大問題了;
  • 不能有註釋,行註釋與塊註釋都不能夠;
  • 字符串中不能有TAB,使用"t"表示;
  • 對象中的全部的key都必須添加雙引號,全部的字符串類型的value也都必須是雙引號格式的;
json與js
  • 由於JSON源於JS,因此JSON在JS中具備得天獨厚的優點;
  • 由於JS是web環境下B端開發語言的不二之選,因此JSON在WEB中大行其道;
  • 優點:node

    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, "\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-java: JSONXXX.fromObject(str), obj.toString()

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

    • 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,下面的字符被認爲是行終止符: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驗證器和格式化工具.
相關文章
相關標籤/搜索