JSON
What is JSON ?
JavaScript Object Notation (JSON)
就是在JavaScript之中,表示物件的一種格式
是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。
以純文字為基底去儲存和傳送簡單結構資料,你可以透過特定的格式去儲存任何資料(字串,數字,陣列,物件),也可以透過物件或陣列來傳送較複雜的資料。
一旦建立了您的 JSON 資料,就可以非常簡單的跟其他程式溝通或交換資料,因為 JSON 就只是純文字個格式。
由道格拉斯·克羅克福特構想設計、輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。
屬於Javascript的一個子集,
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
目前幾乎所有與網頁開發相關的語言都有JSON函式庫。
優點
- 相容性高
- 格式容易瞭解,閱讀及修改方便
- 支援許多資料格式 (number,string,booleans,nulls,array,associative array)
- 許多程式都支援函式庫讀取或修改 JSON 資料
應用
JSON最開始被廣泛的應用於WEB應用的開發。
不過目前JSON使用在JavaScript、Java、Node.js應用的狀況比較多, PHP、C#等開發的WEB應用主要還是使用XML(不一定...個人不認同)。
描述結構
JSON用於描述資料結構
JSON格式簡單來說,就是這二句重點:
- 物件(object)用大括號 { }
- 陣列(array)用中括號 [ ]
整個JSON格式文件之中,是不能使用註解的
[物件(object)]
這裡說的object,就是用key-value的方式儲存
{collection}
一個物件以「{」開始,並以「}」結束。
一個物件包含一系列非排序的名稱/值對,每個名稱/值對之間使用「,」分割。
collection:name:value
間隔: 名稱和值之間使用「:」隔開,一般的形式是:
name : 一個名稱是一個字串; json object的鍵值(key),一定要用文字做鍵值
value : 一個值可以是一個字串,一個數值,一個物件,一個布林值,一個有序列表,或者一個null值。
[陣列(array)]
一個或者多個值用「,」分割後,使用「[」,「]」括起來就形成了這樣的列表
[collection, collection]
[collection]
collection
值可以是
- 陣列[]
- 物件{}
- 字串:以""括起來的一串字元。
- 由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。
- 一个字符(character)即一个单独的字符串(character string)。
- 字符串(string)与C或者Java的字符串非常相似。
- 數值:一系列0-9的數字組合,可以為負數或者小數。還可以用「e」或者「E」表示為指數形式。
- 布林值:表示為true或者false。
- null
[資料轉換]
物件 -> 陣列
就會損失鍵值(key)的資料,留下值(value)
或是程式到時候指定說,要鍵值陣列(key array),就會把所有的鍵值(key)合併一起成陣列
陣列 -> 物件
就可以將每個值編上數字
[文字處理]
在JSON的格式中,關於中文或其他非英文的部份一定要用Unicode encode過
[須跳脫的字元]
有些字元在JSON不能直接打,需要做跳脫的(escape character)
\"
\\
\/
\b
\f
\n
\r
\t
讀取安全性問題
[eval 問題]
由於JSON是JavaScript的子集,所以一般都會使用eval()作為讀取資料的方式,如果是針對可靠的資料來源,在不支援原生JSON解析的瀏覽器上面這是最快速的方法。
然而由於eval方法同樣可以執行任意的JavaScript代碼,因此當資料來源不可靠時則可能產生安全性問題。如下面的例子,直接用eval執行時會跳轉:
var json= eval("{message:(function (){ window.location='http://zh.wikipedia.org/wiki/JSON#.E5.AE.89.E5.85.A8.E6.80.A7.E5.95.8F.E9.A1.8C'; })()}");
沒事不要用eval...
[JSON.parse]
其中一種防止不安全代碼出現的解決辦法,是透過瀏覽器原生支援的JSON.parse(str)方法讀取JSON資料,目前已經得到大部分主流瀏覽器的支援(IE8+,Firefox 3.5+,Chrome4+/Safari4+,Opera10+),
[parseJSON]
在不支援原生JSON物件的瀏覽器上面可以使用parseJSON方法進行讀取[1],
parseJSON採用解析器驗證讀入的代碼是否真的是JSON代碼,這樣就提供了較好的安全性。
但由於這是用模擬的方式讀取,速度上會比eval()慢。
[跨站存取問題]
另外一個安全上的問題則是跨站請求偽造(Cross-site request forgery,簡稱CSRF或XSRF)。
這個問題在Javascript中的狀況是,由於Javascript採用了稱為「沙盒」的機制,
這種機制限制Javascript引擎僅能引入同一個站點的程式碼,因而某種程度上提高了安全性。
其他資料格式比較
[XML]
- XML 優點: 延展性高,資料儲存,擴充功能及高階檢索,易閱讀
- JSON優點: 輕巧,瀏覽器的內建快速解析支援,更適用於網路資料傳輸領域
JSON與XML最大的不同在於XML是一個完整的標記語言,而JSON不是。
這使得XML在程式判讀上需要比較多的功夫。主要的原因在於XML的設計理念與JSON不同。
XML利用標記語言的特性提供了絕佳的延展性(如XPath),在資料儲存,擴充功能及高階檢索方面具備對JSON的優勢,
而JSON則由於比XML更加小巧,以及瀏覽器的內建快速解析支援,使得其更適用於網路資料傳輸領域。
JSON格式取代了xml給網路傳輸帶來了很大的便利,但是卻沒有了xml的一目了然,尤其是json資料很長的時候,我們會陷入繁瑣複雜的資料節點尋找中。
工具
-
JSON 分析器
-
-
WiKi - 字元
參考
WiKi - JSON
清新下午茶 - Johnny Sung - 瞭解JSON格式
http://j796160836.pixnet.net/blog/post/30530326-%E7%9E%AD%E8%A7%A3json%E6%A0%BC%E5%BC%8F
小惡魔 – AppleBOY- 你不可不知的 JSON 基本介紹