2012-01-06 71 views
47

最近开始挖掘到JSON,并且我正在尝试使用一个数字作为“标识符”,这种方法效果不佳。 foo:"bar"工作正常,而0:"bar"没有。使用数字作为“索引”(JSON)

var Game = { 
    status: [ 
       { 
        0:"val", 
        1:"val", 
        2:"val" 
       }, 
       { 
        0:"val", 
        1:"val", 
        2:"val" 
       } 
      ] 
} 

alert(Game.status[0].0); 

有没有办法按照以下方式做到这一点?像Game.status[0].0会让我的生活更轻松。当然,还有其他方法,但这种方式是首选。

+1

原因是,在JavaScript中,与其他许多语言一样,属性的/变量的名称不能以数字开头,但只能使用$,_,a-z和A-Z。为什么Game.status [0]不是数组?那么你的语法就是'Game.status [0] [0]'。 – 2012-01-06 13:50:48

回答

73

JSON只允许键名是字符串。这些字符串可以由数值组成。

虽然您不使用JSON。你有一个JavaScript对象文字。您可以使用密钥的标识符,但标识符不能以数字开头。你仍然可以使用字符串。

var Game={ 
    "status": [ 
     { 
      "0": "val", 
      "1": "val", 
      "2": "val" 
     }, 
     { 
      "0": "val", 
      "1": "val", 
      "2": "val" 
     } 
    ] 
} 

如果您使用点符号访问属性,那么您必须使用标识符。改用方括号表示法:Game[0][0]

但是考虑到这些数据,一个数组似乎更有意义。

var Game={ 
    "status": [ 
     [ 
      "val", 
      "val", 
      "val" 
     ], 
     [ 
      "val", 
      "val", 
      "val" 
     ] 
    ] 
} 
+0

这仍然不允许你做'Game.status [0] .0' – JaredMcAteer 2012-01-06 13:48:29

+8

不,但会允许'Game.status [0] [0]'。 – Amadan 2012-01-06 13:49:00

+3

@OriginalSyn不可能拥有'Game.status [0] .0',因为如果你想使用点符号,Javascript只允许属性名以字母或下划线开头。这是没有办法的。 – zatatatata 2012-01-06 13:52:56

0

什么

Game.status[0][0] or Game.status[0]["0"] ? 

做这些工作呢?

PS:在你的问题中你有什么是一个Javascript对象,而不是JSON。 JSON是Javascript对象的'字符串'版本。

+0

“JSON是Javascript对象的'字符串'版本。”那是不正确的。 JSON对象是JavaScript对象的子集。否则,你是正确的是JavaScript对象,因为它不符合JSON规范 – JaredMcAteer 2012-01-06 13:47:19

+0

JSON是JavaScript *对象文字符号*的子集,而JSON对象是可以用JSON表示的数据类型。 – Quentin 2012-01-06 13:51:42

+0

@OriginalSyn:呃,不是。 JSON是一种“可互换”格式,用作与语言无关的字符串格式。大多数语言都可以解析JSON,而在Javascript中,它会变成一个Javascript对象。请参阅http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/。 – 2012-01-06 13:59:08

4

可能您需要一个数组?

var Game = { 

    status: [ 
     ["val", "val","val"], 
     ["val", "val", "val"] 
    ] 
} 

alert(Game.status[0][0]); 
3

首先,它不是JSON:JSON要求所有的键必须是字符串。

其次,定期阵列做你想做的:

var Game = { 
    status: [ 
    [ 
     "val", 
     "val", 
     "val" 
    ], 
    [ 
     "val", 
     "val", 
     "val" 
    ] 
    } 
} 

会的工作,如果你使用Game.status[0][0]。您不能使用带点号的数字(.0)。

或者,您可以引用数字(即{ "0": "val" }...);您将拥有普通对象而不是阵列,但是相同的语法将起作用。

3

当一个Javascript对象属性的名称不与下划线或字母开头,你不能使用点符号(如Game.status[0].0),你必须使用替代的符号,这是Game.status[0][0]

一个不同的说明,你真的需要它是状态数组内的一个对象吗?如果你像使用数组一样使用对象,为什么不使用真正的数组呢?