相关文章推荐
千杯不醉的黄瓜  ·  uart与usart区别 - ...·  2 年前    · 
唠叨的棒棒糖  ·  【MySQL】order ...·  2 年前    · 
个性的大海  ·  java ...·  3 年前    · 
JSON (JavaScript Object Notation) 是一種輕量級的資料交換格式,易於被閱讀及編寫,也易於機器解析及生成,它是基於 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一個子集。

JSON 採用完全獨立於語言的文本格式,但也使用了類似 C 語言家族 ( 包括 C、C++、C#、Java、JavaScript、Perl、Python 等 ) 的一些習慣。這些特性使 JSON 成為理想的資料交換語言,若在網路上發送大量資料,效能應該可以較為提升 ( Speeding Up AJAX with JSON )。JSON 主要的優點有:相容性高、格式易於瞭解、支援許多資料格式及許多程式都有支援函式庫讀取或修改 JSON 資料。

一、 JSON 建構於兩種結構:

( 一 ) 成對的「名稱 (name) / 值 (value) 」的集合,在不同的語言中被實現成物件 (object)、 記錄 (record)、 結構 (struct)、 字典 (dictionary)、 雜湊表 (hash table) 、索引清單 (keyed list) 、關聯性陣列 (associative array) 。

( 二 ) 一個排序的清單,在不同的語言中被實現成陣列 (array) 、向量 (vector) 、清單 (list) 、序列 (sequence) 。

這些都是常見的資料結構,事實上大部份現代程式語言都以某種形式支持它們,這使得在同樣基於這些結構的程式語言之間有可能利用一種資料格式進行資料交換。 JSON 具有以下這些形式:

1. JSON 物件是一對對「名稱 / 值」的無序集合,以「 { ( 左大括號 ) 」作為開始符號,以「 } ( 右大括號 ) 」作為結束符號,名稱與值之間用「 : ( 冒號 ) 」分隔。

2. JSON 陣列是有序的「值」集合,以「 [ ( 左中括號 ) 」作為開始符號,以「 ] ( 右中括號 ) 」作為結束符號,陣列中的值用「 , ( 逗號 ) 」分隔。

3. 值可以是字串 ( 用雙引號包起來 ) 、數字、 true、false、null、 物件 (object) 和陣列 (array) ,這些結構可以再嵌套 (nested) 。

4. 字串是由雙引號包起來的任意數量的萬國碼 ( Unicode) 字元的集合,使用反斜線作為跳脫字元 ( escapes) 。一個字元就是一個單字元的字串。字串跟 C 或 Java 的字串很類似。

5. 數值也跟 C 或 Java 的數值很相似,除了八進制和十六進制格式不能使用。

6. 空白可以加入到任何符號之間。

7. 相關範例請見 JSON Example ,並有可對照的 XML 格式供參考。

二、安全性問題:

( 一 ) JavaScript的eval()

由於

JSON 在語法上是 JavaScript 的子集合,所以一般都會使用 eval() 作為讀取資料的方式,如果是針對可靠的資料來源,在不支持原生 JSON 解析的瀏覽器上面這是最快速的方法。然而由於 eval 方法同樣可以執行任意的 JavaScript 代碼,因此當資料來源不可靠時則可能產生安全性問題,請考慮如下例子: var json = { message: (function () { window.location='http://zh.wikipedia.org/wiki/JSON/'; })()};

其中一種防止不安全代碼出現的解決辦法是透過瀏覽器原生支持的

JSON.parse(str) 方法讀取 JSON 資料,目前已經得到大部分主流瀏覽器的支持 (IE8+、Firefox 3.5+、Chrome4+/Safari4+、Opera10+) ,在不支持原生 JSON 對象的瀏覽器上面可以使用 parseJSON 方法進行讀取, parseJSON 採用解析器驗證讀入的代碼是否真的是 JSON 代碼,這樣就提供了較好的安全性。但是,由於這是用模擬的方式讀取,速度上會 比eval() 慢。 ( 二 ) 跨站存取問題

另外一個安全上的問題則是跨站請求偽造

(Cross-site request forgery, 簡稱 CSRF或XSRF) 。這個問題在 Javascript 中的狀況是,由於 Javascript 採用了「沙箱 (sandbox) 」的機制,這種機制限制 Javascript 引擎僅能引入同一個站點的代碼,因而某種程度上提高了安全性。 目前,在 Web 開發上主要的資料交換格式有 XML 和 JSON… 等,而 JSON 相對於 XML 有資料格式比較簡單、佔用頻寬較小、易於解析、支援多種語言 … 等優點,但也有通用性較差的缺點。實際上,對於大多數的 Web 應用程式而言,不見得都需要使用到較為複雜的 XML 來傳輸資料,很多 AJAX 甚至直接傳回 HTML 片段來構建動態網頁,不過如此做雖然降低了系統複雜性,但同時也較缺乏彈性,此時可試著改用簡單且彈性的 JSON 來進行資料交換,或許是個不錯的方式;另外在行動裝置上也非常適合使用 JSON 格式來處理資料,所以官方推出新版本的 SDK(iOS 5+、Android 3.0+) 時都已原生支援 JSON 解析,本來使用第三方 JSON 解析器 ( 例如: SBJson、google-gson) 的,現在若採用新版 SDK 時就能更方便使用,也因此使用 JSON 的情形愈來愈普遍。

Library and Information Center
81148 高雄市楠梓區高雄大學路700號
700, Kaohsiung University Rd., Nanzih District, 811. Kaohsiung, Taiwan, R.O.C
本館流通服務台電話 :07-5919306