代码之家  ›  专栏  ›  技术社区  ›  Nikola Stjelja

属性名的JSON语法

  •  28
  • Nikola Stjelja  · 技术社区  · 17 年前

    在javascript中创建对象的正确语法是什么?它可以在大多数Web浏览器中使用(我的意思是: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 回复  |  直到 17 年前
        1
  •  31
  •   Community Mohan Dere    8 年前

    @AndreasN is correct : JSON specification 指示使用引号,以便它实际上是JSON。如果不使用引号,它可能是JavaScript中的有效对象文本,但它不是JSON。除了浏览器端JavaScript之外的其他服务使用JSON(例如使用PHP、Java等的WebServices),并且如果构造一个缺少引号的字符串,则不能保证它将被正确解析——尽管我怀疑大多数实现都足够健壮。

    仅供参考,在javascript中,直接对源代码的JSON字符串使用eval()是很危险的,您不能阻止恶意攻击。再次,看到 JSON site 它提供了更多的解释,以及一个非常短的javascript文件,可以安全地将JSON字符串解析为javascript对象。

    编辑: 我猜从技术上讲,你最初的问题不是关于JSON,而是关于 对象字面量 . 区别在于,可从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
  •  8
  •   James    17 年前

    如果IE在第二个示例中失败,那是因为“class”是一个保留字(仅在IE中)。一般来说,最好用引号括住你的房产名——这样做意味着无论情况如何,它都会一直有效。

        3
  •  7
  •   AndreasN    17 年前

    这个 spec 说“用”。

    火狐不接受,但IE不接受。

    对定义为

    string : value
    

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

    " chars "
    
        4
  •  5
  •   Gareth    17 年前

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

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

    除此之外,两者之间没有区别,我可以想象这两种方式在所有浏览器中都能工作。