将数字用作“索引”(JSON)


87

最近开始深入研究JSON,而我目前正在尝试使用数字作为“标识符”,但效果不太理想。foo:"bar"可以正常工作,而0:"bar"不能。

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

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

有什么办法可以通过以下方式做到这一点?这样的事情Game.status[0].0会让我的生活更轻松。当然,还有其他解决方法,但是这种方法是首选。


3
原因是在JavaScript中,与许多其他语言一样,属性/变量的名称不能以数字开头,而只能以$,_,az和AZ开头。为什么不是Game.status[0]数组?那么您的语法将是Game.status[0][0]
nikc.org 2012年

Answers:


126

JSON仅允许键名称为字符串。这些字符串可以包含数值。

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

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

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

但是鉴于这些数据,数组似乎更有意义。

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

这仍然不允许您这样做Game.status[0].0
JaredMcAteer'1

16
不可以,但是可以Game.status[0][0]
阿玛丹(Amadan)2012年

4
@OriginalSyn不可能具有“ Game.status [0] .0”,因为如果您要使用点表示法,则Javascript仅允许属性名称以字母或下划线开头。没有办法解决。
zatatatata 2012年

1
非常感谢您的回答,正是我想要的。老实说,我不知道为什么我没有想到一开始的阵列-我将其归咎于大脑冻结。
2012年

@ Quentin,JSON和JS对象文字之间You aren't using JSON though. You have a JavaScript object literal. 的唯一区别是?var =还是存在更多区别?JS对象基本上是将JSON存储在变量中吗?
安德烈·布拉托夫

6

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

其次,常规数组可以满足您的需求:

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

如果您使用,将可以使用Game.status[0][0]。不能使用带点号(.0)的数字。

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


5

可能您需要一个数组?

var Game = {

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

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

3

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

一个不同的注释,您真的需要它成为状态数组中的一个对象吗?如果您将对象用作数组,为什么不使用真实数组呢?


2

JSON将键类型调整为字符串。目的是支持点表示法来访问对象的成员。

例如,人= {“身高”:170,“体重”:60,“年龄”:32}。您可以按person.height,person.weight等访问成员。如果JSON支持值键,则其外观类似于person.0,person.1,person.2。


1
我看不到person.1,person.2等有什么问题?
安舒尔

0

关于什么

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

这些方法之一有效吗?

PS:您所遇到的问题是Javascript对象,而不是JSON。JSON是Javascript对象的“字符串”版本。


“ JSON是Javascript对象的'字符串'版本。” 那是不对的。JSON对象是JavaScript对象的子集。否则,您是正确的,因为它不符合JSON规范,因此是JavaScript对象
JaredMcAteer'1

JSON是JavaScript对象文字符号的子集,而JSON对象是可以用JSON表示的数据类型。
昆汀

@OriginalSyn:嗯,不是真的。JSON是一种“可互换”的格式,并且用作与语言无关的字符串格式。大多数语言都可以解析JSON,而在Javascript中,它将变成Javascript对象。参见benalman.com/news/2010/03/theres-no-such-thing-as-a-json
Willem Mulder 2012年

1
@OriginalSyn:在JavaScript中,对象文字永远不是JSON,因为JSON始终是字符串。对象文字不是字符串。术语“ JSON对象”没有意义,因为某些东西不能同时是“ JSON”(字符串)和“ object”(非字符串)。
nnnnnn 2012年

0

JSON是“ JavaScript对象表示法”。JavaScript指定其键必须为字符串或符号。

MDN Docs的以下引用使用术语“键/属性”来指代我经常听到的术语“键/值”。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures#Objects

在JavaScript中,对象可以看作是属性的集合。使用对象文字语法,可以初始化一组有限的属性;然后可以添加和删除属性。属性值可以是任何类型的值,包括其他对象,从而可以构建复杂的数据结构。使用键值标识属性。键值可以是字符串值或符号值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.