属性名称的 JSON 语法

IT技术 javascript json syntax
2021-03-20 03:28:54

在 javascript 中创建对象的正确语法是什么,它可以在大多数网络浏览器中工作(我的意思是:IE 6+、Firefox 2+、Opera 9+)

这有效吗

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

或者是这个:

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

两者有什么区别?

4个回答

@AndreasN 是正确的JSON 规范规定使用引号以使其真正成为 JSON。如果不使用引号,它可能是 Javascript 中的有效对象文字,但它不是 JSON。除了浏览器端 Javascript 之外的其他服务使用 JSON(例如使用 php、Java 等的 web 服务),如果你构造一个缺少引号的字符串,则不能保证它会被正确解析——尽管我怀疑大多数实现都是足够强大来做到这一点。

仅供参考,在 Javascript 中直接对来自无法防止恶意攻击的来源的 JSON 字符串使用 eval() 是危险的。再次,请参阅JSON 站点,它提供了更多解释以及一个非常简短的 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,
};

对象文字“a”和“aname”可以用 JSON 表示(通过在属性名称中添加引号)。但是对象文字“b”和“c”不能。对象文字“b”包含函数(在 JSON 中不允许)。上面的对象字面量“c”包含对其他变量的引用,这种引用在 JSON 中无法表示,因为其中一些引用是共享的。如果您对其进行更改,c.names它也会更改,c.all[1]因为它们共享对同一变量的引用。JSON 只能表达具有树结构的对象(例如整个对象的每个子元素都是独立的)。

规范说用“”。

Firefox 不接受,但 IE 不接受。

对定义为

string : value

值可以是字符串 string 定义为

" chars "
是的,我没有注意到未引用的方法有任何问题
2021-05-19 03:28:54

如果 IE 在您的第二个示例中失败,那是因为 'Class' 是一个保留字(仅在 IE 中)。一般来说,最好用引号将您的属性名称括起来 - 这样做意味着无论情况如何,它都将始终有效。

class 实际上是所有浏览器中的保留字。只是IE在使用时决定失败。
2021-05-09 03:28:54

您必须在包含单词字符以外的任何内容的属性周围使用“引号”

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

除此之外,两者没有区别,我想这两种方式都适用于所有浏览器