2008-12-19 83 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中)。一般来说,最好将你的房产名称用引号括起来 - 这样做意味着无论出现什么情况,它都会一直工作。