2017年5月10日 星期三

JSON 簡介

資料來源

簡介[編輯]
JSON格式是1999年《JavaScript Programming Language, Standard ECMA-262 3rd Edition》的子集合,所以可以在JavaScripteval()函式(javascript通過eval()調用解釋器)讀入。不過這並不代表JSON無法使用於其他語言,事實上幾乎所有與網頁開發相關的語言都有JSON函式庫。
JSON用於描述資料結構,有以下形式存在。
  • 物件(object):一個物件以{開始,並以}結束。一個物件包含一系列非排序的名稱/值對,每個名稱/值對之間使用,分割。
  • 名稱/值(collection):名稱和值之間使用隔開,一般的形式是:
{name:value}
一個名稱是一個字串; 一個值可以是一個字串,一個數值,一個物件,一個布林值,一個有序列表,或者一個null值。
  • 值的有序列表(Array):一個或者多個值用,分割後,使用[]括起來就形成了這樣的列表,形如:
[collection, collection]
  • 字串:以""括起來的一串字元。
  • 數值:一系列0-9的數字組合,可以為負數或者小數。還可以用e或者E表示為指數形式。
  • 布林值:表示為true或者false。
JSON的格式描述可以參考RFC 4627。

應用領域[編輯]

WEB開發[編輯]

JSON最開始被廣泛的應用於WEB應用的開發。不過目前JSON使用在JavaScriptJavaNode.js應用的狀況比較多,PHPC#等開發的WEB應用主要還是使用XML

NoSQL資料庫[編輯]

相對於傳統的關係型資料庫,一些基於文件儲存的NoSQL非關係型資料庫選擇JSON作為其資料儲存格式,比較出名的產品有:MongoDBCouchDBRavenDB等。

舉例[編輯]

 1 {
 2      "firstName": "John",
 3      "lastName": "Smith",
 4      "sex": "male",
 5      "age": 25,
 6      "address": 
 7      {
 8          "streetAddress": "21 2nd Street",
 9          "city": "New York",
10          "state": "NY",
11          "postalCode": "10021"
12      },
13      "phoneNumber": 
14      [
15          {
16            "type": "home",
17            "number": "212 555-1234"
18          },
19          {
20            "type": "fax",
21            "number": "646 555-4567"
22          }
23      ]
24  }
[
{
     "text":"This is the text","color":"dark_red","bold":"true","strikethough":"true","clickEvent":
          {"action":"open_url","value":"zh.wikipedia.org"},
     "hoverEvent":
          {"action":"show_text","value":
               {"extra":"something"}
          }
},
{
     "translate":"item.dirt.name","color":"blue","italic":"true"
}
]

安全性問題[編輯]

讀取JSON[編輯]

由於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'; })()}");
其中一種防止不安全代碼出現的解決辦法,是透過瀏覽器原生支援的JSON.parse(str)方法讀取JSON資料,目前已經得到大部分主流瀏覽器的支援(IE8+,Firefox 3.5+,Chrome4+/Safari4+,Opera10+),在不支援原生JSON物件的瀏覽器上面可以使用parseJSON方法進行讀取[1]parseJSON採用解析器驗證讀入的代碼是否真的是JSON代碼,這樣就提供了較好的安全性。但由於這是用模擬的方式讀取,速度上會比eval()慢。

跨站存取問題[編輯]

另外一個安全上的問題則是跨站請求偽造(Cross-site request forgery,簡稱CSRF或XSRF)。這個問題在Javascript中的狀況是,由於Javascript採用了稱為「沙盒」的機制,這種機制限制Javascript引擎僅能引入同一個站點的程式碼,因而某種程度上提高了安全性。

與其他格式的比較[編輯]

XML[編輯]

JSON與XML最大的不同在於XML是一個完整的標記語言,而JSON不是。這使得XML在程式判讀上需要比較多的功夫。主要的原因在於XML的設計理念與JSON不同。XML利用標記語言的特性提供了絕佳的延展性(如XPath),在資料儲存,擴充功能及高階檢索方面具備對JSON的優勢,而JSON則由於比XML更加小巧,以及瀏覽器的內建快速解析支援,使得其更適用於網路資料傳輸領域。

外部連結[編輯]

沒有留言: