Używanie numeru jako „indeksu” (JSON)


89

Niedawno zacząłem kopać w JSON, a obecnie próbuję użyć liczby jako „identyfikatora”, co nie działa zbyt dobrze. foo:"bar"działa dobrze, a 0:"bar"nie.

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

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

Czy można to zrobić w następujący sposób? Coś takiego, Game.status[0].0co ułatwiłoby mi życie. Oczywiście można to obejść na inne sposoby, ale ten sposób jest preferowany.


3
Powodem tego jest to, że w JavaScript, podobnie jak w wielu innych językach, nazwa właściwości / zmiennej nie może zaczynać się od liczby, a jedynie od $, _, az i AZ. Dlaczego nie Game.status[0]jest tablicą? Wtedy twoja składnia byłaby Game.status[0][0].
nikc.org,

Odpowiedzi:


133

JSON zezwala tylko na to, aby nazwy kluczy były ciągami. Te ciągi mogą składać się z wartości liczbowych.

Nie używasz jednak formatu JSON. Masz literał obiektu JavaScript. Państwo może używać identyfikatorów na klucze, ale identyfikator nie może zaczynać się od cyfry. Jednak nadal możesz używać ciągów.

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

Jeśli uzyskujesz dostęp do właściwości za pomocą notacji z kropką, musisz użyć identyfikatorów. Zamiast tego użyj notacji w nawiasach kwadratowych:Game.status[0][0] .

Ale biorąc pod uwagę te dane, tablica wydaje się mieć więcej sensu.

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

To nadal by ci na to nie pozwoliłoGame.status[0].0
JaredMcAteer

16
Nie, ale pozwoli Game.status[0][0].
Amadan

4
@OriginalSyn nie można mieć ´Game.status [0] .0´, ponieważ Javascript pozwala tylko na rozpoczęcie nazw właściwości od litery lub podkreślenia, jeśli chcesz użyć notacji kropkowej. Nie da się tego obejść.
zatatatata

1
Bardzo dziękuję za odpowiedź, dokładnie to, czego szukałem. Szczerze mówiąc, nie mam pojęcia, dlaczego nie pomyślałem o tablicy na początek - winię za to zamrożenie mózgu.
Zar

@Quentin, You aren't using JSON though. You have a JavaScript object literal. czy jedyną różnicą jest, var =czy jest więcej różnic między JSON a literałem obiektu JS? Czy obiekt JS to po prostu JSON przechowywany w zmiennej?
Andre Bulatov

7

Po pierwsze, to nie jest JSON: JSON nakazuje, aby wszystkie klucze były ciągami.

Po drugie, zwykłe tablice robią, co chcesz:

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

zadziała, jeśli użyjesz Game.status[0][0]. Nie możesz używać liczb z notacją kropkową ( .0).

Alternatywnie możesz zacytować liczby (tj. { "0": "val" }...); będziesz mieć zwykłe obiekty zamiast tablic, ale ta sama składnia będzie działać.


5

Prawdopodobnie potrzebujesz tablicy?

var Game = {

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

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

3

Gdy nazwa właściwości obiektu JavaScript nie zaczyna się od podkreślenia ani litery, nie można używać notacji z kropką (np. Game.status[0].0 ) I należy użyć notacji alternatywnej, czyli Game.status[0][0].

Jeszcze jedna uwaga, czy naprawdę potrzebujesz, aby był to obiekt wewnątrz tablicy statusu? Jeśli używasz obiektu jako tablicy, dlaczego nie użyć zamiast niej prawdziwej tablicy?


2

JSON reguluje typ klucza jako ciąg. Celem jest wsparcie notacji kropkowej w celu uzyskania dostępu do elementów składowych obiektu.

Na przykład osoba = {"wzrost": 170, "waga": 60, "wiek": 32}. Możesz uzyskać dostęp do członków według person.height, person.weight itp. Jeśli JSON obsługuje klucze wartości, wyglądałoby to następująco: person.0, person.1, person.2.


1
Nie widzę, co jest nie tak z osobą 1, osobą 2 itd.?
Anshul

1

JSON to „JavaScript Object Notation”. JavaScript określa, że ​​jego klucze muszą być łańcuchami lub symbolami.

Poniższy cytat z MDN Docs używa terminów „klucz / właściwość” w odniesieniu do tego, co częściej słyszę jako „klucz / wartość”.

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

W JavaScript obiekty można postrzegać jako zbiór właściwości. Dzięki składni literału obiektowego inicjowany jest ograniczony zestaw właściwości; następnie można dodawać i usuwać właściwości. Wartości właściwości mogą być wartościami dowolnego typu, w tym innymi obiektami, co umożliwia budowanie złożonych struktur danych. Właściwości są identyfikowane za pomocą wartości kluczowych. Wartość klucza jest ciągiem lub wartością symbolu.


0

Co powiesz na

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

Czy któryś z nich działa?

PS: To, co masz w swoim pytaniu, to obiekt JavaScript, a nie JSON. JSON to „ciągowa” wersja obiektu Javascript.


„JSON to„ ciągowa ”wersja obiektu JavaScript”. To nie jest prawda. Obiekt JSON jest podzbiorem obiektu JavaScript. W przeciwnym razie masz rację, że jest to obiekt JavaScript, ponieważ nie jest zgodny ze specyfikacją JSON
JaredMcAteer

JSON jest podzbiorem notacji literału obiektu JavaScript, a obiekt JSON to typ danych, który można wyrazić w formacie JSON.
Quentin,

@OriginalSyn: Cóż, nie do końca. JSON jest formatem „wymiennym” i jest używany jako niezależny od języka format ciągu. Większość języków może analizować JSON, aw JavaScript zamieni się on w obiekt Javascript. Zobacz benalman.com/news/2010/03/theres-no-such-thing-as-a-json .
Willem Mulder

1
@OriginalSyn: W JavaScript, literały obiektów nigdy nie są JSON, ponieważ JSON jest zawsze ciągiem. Literały obiektu nie są ciągami. Termin „obiekt JSON” nie ma sensu, ponieważ coś nie może być jednocześnie „JSON” - ciągiem i „obiektem” - niebędącym ciągiem.
nnnnnn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.