【问题标题】:JSON syntax for property names属性名称的 JSON 语法
【发布时间】:2008-12-19 12:33:22
【问题描述】:

在 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"
};

这两者有什么区别?

【问题讨论】:

    标签: javascript json syntax


    【解决方案1】:

    @AndreasN is correctJSON specification 指示使用引号,以便它实际上是 JSON。如果不使用引号,它可能是 Javascript 中的有效对象文字,但不是 JSON。除了浏览器端 Javascript 之外的其他服务使用 JSON(例如,使用 php、Java 等的 web 服务),如果您构造一个缺少引号的字符串,则无法保证它会被正确解析——尽管我怀疑大多数实现会是足够强大,可以这样做。

    仅供参考,在 Javascript 中直接对来自无法防止恶意攻击的源的 JSON 字符串使用 eval() 是很危险的。同样,请参阅JSON site,它提供了更多解释,以及一个非常短的 javascript 文件,可以安全地将 JSON 字符串解析为 Javascript 对象。

    编辑:我想从技术上讲,您最初的问题不是关于 JSON,而是关于 object literals 的 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 只能表达具有树状结构的对象(例如,整个对象的每个子元素都是独立的)。

    【讨论】:

      【解决方案2】:

      spec 说要使用“”。

      Firefox 不接受,但 IE 不接受。

      对定义为

      string : value
      

      值可以是字符串 字符串定义为

      " chars "
      

      【讨论】:

      • 是的,我没有注意到未引用方法有任何问题
      【解决方案3】:

      如果 IE 在您的第二个示例中失败,那是因为“类”是保留字(仅在 IE 中)。一般来说,最好用引号将您的属性名称括起来 - 这样做意味着它总是可以工作,无论在什么情况下。

      【讨论】:

      • class 实际上是所有浏览器中的保留字。只是IE在使用时决定失败。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-21
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        相关资源
        最近更新 更多