JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和產生。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON採用完全獨立於語言的文字格式設定,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的資料交換語言。
JSON建構於兩種結構:
- “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),雜湊表(hash table),有鍵列表(keyed list),或者關聯陣列 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
這些都是常見的資料結構。事實上大部分現代電腦語言都以某種形式支援它們。這使得一種資料格式在同樣基於這些結構的程式設計語言之間交換成為可能。
JSON具有以下這些形式:
對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括弧)開始,“}”(右括弧)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
數組是值(value)的有序集合。一個數組以“[”(左中括弧)開始,“]”(右中括弧)結束。值之間使用“,”(逗號)分隔。
值(value)可以是雙引號括起來的字串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。
字串(string)是由雙引號包圍的任意數量Unicode字元的集合,使用反斜線轉義。一個字元(character)即一個單獨的字串(character string)。
字串(string)與C或者Java的字串非常相似。
數值(number)也與C或者Java的數值非常相似。除去未曾使用的八進位與十六進位格式。除去一些編碼細節。
因為JSON 是 javascript 的一個子集,所以,在javascript 中使用JSON是非常簡單的
js 代碼
- var myJSONObject = {"bindings": [
- {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
- {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
- {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
- ]
- };
在上面的例子中,我們建立了只包含一個成員 "bindings" 的一個對象,bindings 則包含了一個由3個對象組成的數組。這3個對象都包含3個成員:"ircEvent", "method","regex"。
在javascript 中, 成員可以通過“點號”來擷取。
比如:js 代碼
- myJSONObject.bindings[0].method
通過eval() 函數可以將JSON字串轉化為對象。js 代碼
- var myObject = eval('(' + myJSONtext + ')');
eval 函數非常快,但是它可以編譯任何 javascirpt 代碼,這樣的話就可能產生安全的問題。eval 的使用是基於傳入的代碼參數是可靠的假設的,有一些情況下,可能用戶端是不可信任的。
如果基於安全的考慮的話,最好是使用一個 JSON 解析器。 一個 JSON 解析器將只接受 JSON 文本。所以是更安全的。
js 代碼
- var myObject = JSON.parse(myJSONtext, filter);
可選的 filter 參數將遍曆每一個value key 值對, 並進行相關的處理。如:
js 代碼
- myData = JSON.parse(text, function (key, value) {
- return key.indexOf('date') >= 0 ? new Date(value) : value; });
stringifier 函數的作用跟 parse 相反, 用來將一個js對象轉換為 JSON 文本。
js 代碼
- var myJSONText = JSON.stringifier(myObject);
這裡是一個開源的 JSON parser and JSON stringifier
eval的功能簡介:
eval可以將字串產生語句執行,和SQL的exec()類似。
eval的使用場合是什麼呢?有時候我們預先不知道要執行什麼語句,只有當條件和參數給時才知道執行什麼語句,這時候eval就派上用場了。舉個例子:
我們要做一個function(),功能是輸入網頁中兩個個對象的名稱,然後程式就將這兩個對象的值聯結起來輸出。
function output(a,b)
{
var tmpa,tmpb;
tmpa=document.all.a.value;
tmpb=document.all.b.value;
document.write(tmpa+tmpb);
}
output('input1','input2');
這樣你執行的時候就會提示錯誤“document.all.a不是對象”以及“document.all.b不是對象”。原來 javascript把a和b當成對象名稱了,怎樣能讓javascript把a裡面的值作為對象名稱呢?這時候就要用eval了,把代碼改成這樣:
function output(a,b)
{
var tmpa,tmpb;
tmpa=eval("document.all."+a+".value");
tmpb=eval("document.all."+b+".value");
document.write(tmpa+tmpb);
}
output('input1','input2');
這樣javascript就會先取出a,b的值,然後和前面的document.all.以及後面的.value組合運行,於是就可以
順利取出input1和input2的值,我們的目的達到了。