Использование числа в качестве индекса (JSON)

Недавно начал копаться в 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 сделало бы мою жизнь намного проще. Конечно, есть и другие способы обойти это, но этот путь предпочтительнее.


person Zar    schedule 06.01.2012    source источник
comment
Причина этого в том, что в JavaScript, как и во многих других языках, имя свойства/переменной не может начинаться с цифры, а только с $, _, a-z и A-Z. Почему Game.status[0] не массив? Тогда ваш синтаксис будет Game.status[0][0].   -  person nikc.org    schedule 06.01.2012


Ответы (7)


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"
        ]
    ]
}
person Quentin    schedule 06.01.2012
comment
Это все равно не позволит вам сделать Game.status[0].0 - person JaredMcAteer; 06.01.2012
comment
Нет, но позволит Game.status[0][0]. - person Amadan; 06.01.2012
comment
@OriginalSyn невозможно иметь «Game.status [0].0», потому что Javascript позволяет именам свойств начинаться только с буквы или символа подчеркивания, если вы хотите использовать запись через точку. Нет никакого способа обойти это. - person zatatatata; 06.01.2012
comment
Большое спасибо за ответ, именно то, что я искал. Честно говоря, я понятия не имею, почему я не подумал о массиве для начала - я буду винить в этом замораживание мозга. - person Zar; 06.01.2012
comment
@Quentin, You aren't using JSON though. You have a JavaScript object literal. Единственная разница в var = или между JSON и литералом объекта JS больше различий? Является ли объект JS в основном JSON, хранящимся в переменной? - person Andre Bulatov; 04.10.2015
comment
@AndreBulatov — JSON — это формат данных, такой как CSV или XML. Литерал объекта JavaScript является частью программы JavaScript. Синтаксис JSON основан на литеральном синтаксисе JavaScript, но значительно проще. - person Quentin; 04.10.2015
comment
Итак, если я создам небольшую базу данных определений ~500 строк для некоторых элементов в формате JSON, например, jsoneditoronline.org, то во-вторых, я помещаю его в код JavaScript, мы называем его литералом объекта? Если да, то это потому, что единственный способ включить его в var и единственный способ для движка JS прочитать переменную в формате JS (ON) - это как объект (а также потому, что JSON - это просто порождение аккуратности объектов JS синтаксис)? - person Andre Bulatov; 05.10.2015
comment
Или литерал массива, или любой другой тип данных, который вы используете. Это не единственный способ включить его: вы можете сохранить его в отдельном файле (в этом случае это будет JSON), а затем прочитать его и проанализировать (используя функцию JSON.parse()) - person Quentin; 05.10.2015
comment
Для справки, RFC4627 разъясняет: › Объект представляет собой неупорядоченный набор из нуля или более имен/ пары значений, где имя — это строка, а значение — это строка, число, логическое значение, нуль, объект или массив. (выделено мной) - person Adam Batkin; 04.12.2017

Во-первых, это не JSON: JSON требует, чтобы все ключи были строками.

Во-вторых, обычные массивы делают то, что вы хотите:

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

будет работать, если вы используете Game.status[0][0]. Вы не можете использовать числа с точечной нотацией (.0).

В качестве альтернативы вы можете указать числа (например, { "0": "val" }...); у вас будут простые объекты вместо массивов, но будет работать тот же синтаксис.

person Amadan    schedule 06.01.2012

Наверное, вам нужен массив?

var Game = {

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

alert(Game.status[0][0]);
person yatskevich    schedule 06.01.2012

Если имя свойства объекта Javascript не начинается ни с символа подчеркивания, ни с буквы, вы не можете использовать точечную нотацию (например, Game.status[0].0) и должны использовать альтернативную нотацию, то есть Game.status[0][0].

Еще одно замечание: вам действительно нужно, чтобы он был объектом внутри массива состояния? Если вы используете объект как массив, почему бы вместо этого не использовать настоящий массив?

person zatatatata    schedule 06.01.2012

JSON регулирует тип ключа как строку. Цель состоит в том, чтобы поддерживать точечную нотацию для доступа к членам объекта.

Например, человек = {"рост":170, "вес":60, "возраст":32}. Вы можете получить доступ к членам по person.height, person.weight и т. д. Если JSON поддерживает ключи значений, то это будет выглядеть как person.0, person.1, person.2.

person Huiguorou    schedule 22.08.2018
comment
Я не понимаю, что не так с person.1, person.2 и т. д.? - person Anshul; 30.01.2019

JSON — это «обозначение объекта JavaScript». JavaScript указывает, что его ключи должны быть строками или символами.

В следующей цитате из MDN Docs термины «ключ/свойство» используются для обозначения того, что я чаще всего слышу под термином «ключ/значение».

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

В JavaScript объекты можно рассматривать как набор свойств. При синтаксисе литерала объекта инициализируется ограниченный набор свойств; затем свойства могут быть добавлены и удалены. Значения свойств могут быть значениями любого типа, включая другие объекты, что позволяет создавать сложные структуры данных. Свойства идентифицируются с использованием ключевых значений. Значением ключа является значение строки или символа.

person 2540625    schedule 14.02.2020

Как насчет

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

Один из них работает?

PS: В вашем вопросе есть объект Javascript, а не JSON. JSON — это «строковая» версия объекта Javascript.

person Willem Mulder    schedule 06.01.2012
comment
JSON — это «строковая» версия объекта Javascript. Это неправда. Объект JSON является подмножеством объекта JavaScript. В противном случае вы правы, что это объект JavaScript, поскольку он не соответствует спецификации JSON. - person JaredMcAteer; 06.01.2012
comment
JSON — это подмножество JavaScript литеральная нотация объекта, а объект JSON — это тип данных, который может быть выражен в JSON. - person Quentin; 06.01.2012
comment
@OriginalSyn: Ну, не совсем так. JSON является взаимозаменяемым форматом и используется как формат строки, не зависящий от языка. Большинство языков могут анализировать JSON, а в Javascript он превратится в объект Javascript. См. benalman.com/news/2010/ 03/нет такого-как-json. - person Willem Mulder; 06.01.2012
comment
@OriginalSyn: в JavaScript литералы объектов никогда не являются JSON, потому что JSON всегда является строкой. Литералы объектов не являются строками. Термин объект JSON не имеет смысла, потому что что-то не может быть одновременно JSON — строкой и объектом — нестрокой. - person nnnnnn; 06.01.2012