本文旨在短時間內讓讀者簡單的認識 JSON
JSON 簡介
JSON,即 JavaScript Object Notation 的縮寫,指的是 JavaScript 的對象表示法,雖然 JSON 使用 JS 語法來描述數據對象,但其本身獨立於語言和平台,JSON 的解析器和庫都支持不同的編程語言。
與 XML(可擴展標記語言)類似的是,JSON 是純文本;具有自我描述性,即我們可以簡單的理解它;具有層級結構。
JSON 語法
JSON 數據的書寫格式是名稱/值對,其中包括雙引號中的欄位名稱,後面寫一個冒號,然後是值,值可以是整數或浮點數、雙引號中的字元串、true or false、方括弧中的數組、花括弧中的對象;null。例如下面這條
"JSON":"helloworld"
這條語句等價於
JSON = "helloworld"
JSON 對象在花括弧中書寫,其中可以包含多個名稱/值對,比如下面這條
{ "JS":"hello", "ON":"world" }
等價於
JS ="hello", ON ="world"
JSON 數組在方括弧中書寫,其中可以包含多個對象,
{ "JP":[ {"JS":"hell", "ON":"wrld"}, {"JS":"helo", "ON":"wold"}, {"JS":"hllo", "ON":"word"} ] }
因為 JSON 使用的是 JavaScript 的語法,所以無需額外的軟體就能處理JS 中的 JSON,比如這樣
var JP = [ {"JS":"hell", "ON":"wrld"}, {"JS":"helo", "ON":"wold"}, {"JS":"hllo", "ON":"word"} ];
如果要訪問對象數組,可以像這樣進行訪問
JP[0].JS
返回的內容是
hell
JavaScript 處理 JSON 數據
JSON 最常見的用法之一,是從 web 伺服器上讀取 JSON 數據,將 JSON 數據轉換為 JavaScript 對象,然後在網頁中使用該數據。接下來,我們來討論 JavaScript 如何處理 JSON 數據。
在 web 頁面中用 JavaScript 處理 JSON 數據時,
function handleJson() { var Message={"name":"Michael","address": {"city":"Beijing","street":"Chaoyang Road","postcode":100025} }; document.write(Message.name); document.write(Message.address.city); }
假定伺服器返回的 JSON 數據是上文的:
{ "name":"Michael", "address":{ "city":"Beijing", "street":" Chaoyang Road ", "postcode":100025 } }
只需將其賦值給一個 JavaScript 變數(例如上文中的 Message),就可以立刻使用該變數並更新頁面中的信息了。
這相比起 XML 就顯得更加的容易。我們要做的僅僅是將伺服器返回的JSON 數據賦給一個 JavaScript 變數即可。
JSON 的數據可移植性問題
JSON 允許 Unicode 行結束符 U + 2028(行分隔符)和 U + 2029(段落分隔符)在引用字元串中顯示為非轉義,而 JavaScript 不顯示。這是JSON 只禁止"控制字元"的結果。為了最大限度地提高可移植性,這些字元應該反斜杠轉義。生成 JSONP 時,這個微妙之處非常重要。
更多關於 U+2028/2029 的討論:
https://github.com/rack/rack-contrib/pull/37
JSON 文檔可以用 UTF-8,UTF-16 或 UTF-32 編碼,默認編碼為 UTF-8(I-JSON 僅支持 UTF-8)。這些編碼支持完整的 Unicode 字符集,包括基本多語言面以外的字元(U + 10000至U + 10FFFF)。但是,如果轉義,那麼這些字元必須使用 UTF-16 代理對(一些 JSON 解析器遺漏的細節)編寫。例如,在 JSON 中包含表情符號字元U + 1F602 ?(喜極而泣):
{ "face" : "?" }
//或
{ "face" : "\uD83D\uDE02" }
JSON 中的數字在編程語言中的表示是不可知的。整數和浮點值之間沒有區分太清楚:一些可能把42,42.0以及4.2E+1當成是一樣的,而其他的可能不會。對於溢出,下溢,精度損失或舍入等問題沒有要求。另外,JSON 沒有提及有符號零的處理:0.0是否不同於-0.0。使用 IEEE 754浮點標準(包括 JavaScript)的大多數實現都保留帶符號的零; 但並不是所有的 JSON 實現都可以這樣做。