JSON

维基百科,自由的百科全书
跳转至: 导航搜索

JSONJavaScript Object Notation)是一種輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。儘管JSON是Javascript的一個子集,但JSON是獨立於語言的文本格式,並且採用了類似於C語言家族的一些習慣。

簡介[编辑]

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应用的开发,随着Web2.0的方兴未艾,JSON在WEB数据传输领域占有重要的地位。[來源請求]

NoSQL数据库[编辑]

相对于传统的关系型数据库,一些基于文档存储的NoSQL非关系型数据库选择JSON作为其数据存储格式,比较出名的产品有:MongoDBCouchDBRavenDB等。

举例[编辑]

{
     "firstName": "John",
     "lastName": "Smith",
     "sex": "third",
     "age": 25,
     "address": 
     {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": "10021"
     },
     "phoneNumber": 
     [
         {
           "type": "home",
           "number": "212 555-1234"
         },
         {
           "type": "fax",
           "number": "646 555-4567"
         }
     ]
 }

安全性問題[编辑]

读取 JSON[编辑]

由於 JSON 是 JavaScript 的子集,所以一般都會使用 eval() 作為讀取資料的方式,如果是针对可靠的数据来源,在不支持原生 JSON 解析的浏览器上面这是最快速的方法。然而由于 eval 方法同样可以执行任意的 JavaScript 代码,因此当数据来源不可靠时则可能产生安全性问题。如下面的例子,直接用 eval 执行时会跳转:

var json = {
  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更加小巧,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。

YAML[编辑]

MessagePack[编辑]

MessagePack 宣称比 JSON 更短小,快速

格式化工具[编辑]

JSON格式取代了xml给网络传输带来了很大的便利,但是却没有了xml的一目了然,尤其是json数据很长的时候,我们会陷入繁琐复杂的数据节点查找中。开发者可以通过在线JSON格式化工具,如http://www.jsoneditoronline.org。

參考文獻[编辑]

參見[编辑]

外部連結[编辑]