2008-12-19 80 views
26

什麼是正確的語法使用JavaScript創建對象,這將在整個大多數W​​eb瀏覽器上(我的意思是:IE 6 +,Firefox的2 +,歌劇9+)的屬性名稱JSON語法

是這有效


var a={ "class": "Person", 
     "name": "William Shakespeare", 
     "birthday": -12802392000000, 
     "nickname": "Bill" 
     } ; 

或者是這樣的:


var a={ class: "Person", 
     name: "William Shakespeare", 
     birthday: -12802392000000, 
     nickname: "Bill" 
     } ; 

而且兩者有什麼區別?

回答

30

@AndreasN is correctJSON specification指示使用引號以使其實際爲JSON。如果您不使用引號,則它可能是Javascript中的有效對象字面值,但它不是JSON。除瀏覽器端JavaScript以外的其他服務使用JSON(例如使用php,Java等的web服務),並且如果構造缺少引號的字符串,則不能保證它將被正確解析 - 儘管我懷疑大多數實現會是足夠強大,可以這樣做。

僅供參考在JavaScript中直接使用eval()從源代碼中防止惡意攻擊的來源是危險的。再次看到JSON site,它給出了更多的解釋以及一個非常簡短的JavaScript文件,可以安全地將JSON字符串解析爲Javascript對象。

編輯:我猜技術上你原來的問題是不是JSON而是JavaScript的語法對象文本。不同的是,對象從JSON字符串構造將排除許多其他可能的對象常量,如:

var a = {cat: "meow", dog: "woof"}; 
var aname = {cat: "Garfield", dog: "Odie"}; 
var b = { 
    counter: 0, 
    pow: function(x) { return x+1; }, 
    zap: function(y) { return (counter += y); } 
}; 
var c = { 
    all: [a,aname], 
    animals: a, 
    names: aname, 
}; 

對象文本和「aname」可以在JSON來表示(加引號的屬性名稱)「一」 。但是對象文字「b」和「c」不能。對象字面量「b」包含函數(JSON中不允許)。上面的對象文字「c」以一種不能用JSON表示的方式包含對其他變量的引用,因爲有些引用是共享的。如果您對c.names進行更改,它也將更改c.all[1],因爲它們共享對同一個變量的引用。 JSON只能表示具有樹結構的對象(例如,整個對象的每個子元素都是獨立的)。

7

spec說使用「」。

Firefox接受沒有,但IE不。作爲

" chars " 
+0

IE也是如此。即使IE6接受它。 – Tomalak 2008-12-19 12:50:12

+0

是的,我還沒有注意到任何問題與未引用的方法 – nickf 2008-12-19 13:11:13

4

你必須使用包含其他什麼比單詞字符「引號」各地的物業

對被定義爲

string : value 

值可以是一個字符串 串定義

{foo-bar: 3} // invalid 
{"foo-bar": 3} // valid 

除此之外,兩者之間沒有區別我想這兩種方式跨所有瀏覽器

8

如果IE瀏覽器失敗,你的第二個例子,因爲'類'是一個保留字(只在IE中)。一般來說,最好將你的房產名稱用引號括起來 - 這樣做意味着無論出現什麼情況,它都會一直工作。