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值。

object

[陣列(array)]

一個或者多個值用「,」分割後,使用「[」,「]」括起來就形成了這樣的列表

[collection, collection]

array

[collection]

collection

值可以是

  • 陣列[]
  • 物件{}
  • 字串:以""括起來的一串字元。
    • 由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。
    • 一个字符(character)即一个单独的字符串(character string)。
    • 字符串(string)与C或者Java的字符串非常相似。
  • 數值:一系列0-9的數字組合,可以為負數或者小數。還可以用「e」或者「E」表示為指數形式。
  • 布林值:表示為true或者false。
  • null

value

number

[資料轉換]

  • 物件 -> 陣列

    就會損失鍵值(key)的資料,留下值(value)

    或是程式到時候指定說,要鍵值陣列(key array),就會把所有的鍵值(key)合併一起成陣列

  • 陣列 -> 物件

    就可以將每個值編上數字

[文字處理]

在JSON的格式中,關於中文或其他非英文的部份一定要用Unicode encode

[須跳脫的字元]

有些字元在JSON不能直接打,需要做跳脫的(escape character)

\"
\\
\/
\b
\f
\n
\r
\t

string


讀取安全性問題

[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資料很長的時候,我們會陷入繁瑣複雜的資料節點尋找中。


工具

參考

results matching ""

    No results matching ""