【问题标题】:Using number as "index" (JSON)使用数字作为“索引”(JSON)
【发布时间】:2012-02-04 05:37:34
【问题描述】:

最近开始深入研究 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 这样的东西会让我的生活更轻松。当然还有其他的方法,但是这种方法是首选。

【问题讨论】:

  • 这是因为在 JavaScript 中,和许多其他语言一样,属性/变量的名称不能以数字开头,而只能以 $、_、a-z 和 A-Z 开头。为什么Game.status[0] 不是一个数组?那么你的语法就是Game.status[0][0]

标签: javascript json identifier


【解决方案1】:

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
  • 否,但允许Game.status[0][0]
  • @OriginalSyn 不可能有“Game.status[0].0”,因为如果你想使用点符号,Javascript 只允许属性名称以字母或下划线开头。没有办法解决这个问题。
  • 非常感谢您的回答,正是我想要的。老实说,我不知道为什么我没有想到一个数组开始 - 我会把它归咎于大脑冻结。
  • @Quentin, You aren't using JSON though. You have a JavaScript object literal. 唯一的区别是var = 还是 JSON 和 JS 对象字面量之间有更多区别? JS 对象基本上是 JSON 存储在变量中吗?
【解决方案2】:

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

其次,常规数组做你想做的事:

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

如果您使用Game.status[0][0],它将起作用。您不能使用带点表示法的数字 (.0)。

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

【讨论】:

    【解决方案3】:

    可能你需要一个数组?

    var Game = {
    
        status: [
            ["val", "val","val"],
            ["val", "val", "val"]
        ]
    }
    
    alert(Game.status[0][0]);
    

    【讨论】:

      【解决方案4】:

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

      另一个注意事项,你真的需要它成为状态数组中的一个对象吗?如果你像数组一样使用对象,为什么不使用真正的数组呢?

      【讨论】:

        【解决方案5】:

        JSON 将键类型规定为字符串。目的是支持点符号访问对象的成员。

        例如,person = {"height":170, "weight":60, "age":32}。您可以通过 person.height、person.weight 等来访问成员。如果 JSON 支持 value 键,那么它看起来像 person.0、person.1、person.2。

        【讨论】:

        • 我看不出 person.1、person.2 等有什么问题?
        【解决方案6】:

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

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

        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Objects

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

        【讨论】:

          【解决方案7】:

          怎么样

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

          其中之一有效吗?

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

          【讨论】:

          • “JSON 是 Javascript 对象的‘字符串’版本。”那不是真的。 JSON 对象是 JavaScript 对象的子集。否则你是正确的,它是一个 JavaScript 对象,因为它不符合 JSON 规范
          • JSON 是 JavaScript 对象字面量表示法 的子集,JSON 对象是可以用 JSON 表示的数据类型。
          • @OriginalSyn:嗯,不是真的。 JSON 是一种“可互换”的格式,用作与语言无关的字符串格式。大多数语言都可以解析 JSON,在 Javascript 中,它会变成一个 Javascript 对象。见benalman.com/news/2010/03/theres-no-such-thing-as-a-json
          • @OriginalSyn:在 JavaScript 中,对象字面量从不 JSON,因为 JSON总是 一个字符串。对象文字不是字符串。术语“JSON 对象”没有意义,因为某些东西不能既是“JSON”——一个字符串,又是一个“对象”——一个非字符串。
          猜你喜欢
          • 2017-06-08
          • 2017-07-13
          • 2021-12-25
          • 2013-10-23
          • 1970-01-01
          • 2021-09-02
          • 1970-01-01
          • 1970-01-01
          • 2018-02-27
          相关资源
          最近更新 更多