json的歷史和eval函式
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)
- 值的有序列表(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 值對, 並進行相關的處理。如:
- myData = JSON.parse(text, function (key, value) {
- return key.indexOf('date') >= 0 ? new Date(value) : value; });
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的值,我們的目的達到了。