Verwenden der Nummer als "Index" (JSON)

87

Ich habe vor kurzem angefangen, mich mit JSON zu beschäftigen, und ich versuche derzeit, eine Nummer als "Kennung" zu verwenden, was nicht so gut funktioniert. foo:"bar"funktioniert gut, 0:"bar"aber nicht.

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

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

Gibt es eine Möglichkeit, dies folgendermaßen zu tun? So etwas Game.status[0].0würde mir das Leben leichter machen. Natürlich gibt es andere Möglichkeiten, aber diese Art wird bevorzugt.

Zar
quelle
3
Der Grund dafür ist, dass in JavaScript, wie in vielen anderen Sprachen, der Name einer Eigenschaft / Variablen nicht mit einer Zahl beginnen kann, sondern nur mit $, _, az und AZ. Warum ist kein Game.status[0]Array? Dann wäre Ihre Syntax Game.status[0][0].
Nikc.org

Antworten:

124

JSON erlaubt nur, dass Schlüsselnamen Zeichenfolgen sind. Diese Zeichenfolgen können aus numerischen Werten bestehen.

Sie verwenden JSON jedoch nicht. Sie haben ein JavaScript-Objektliteral. Sie können Bezeichner für Schlüssel verwenden, aber ein Bezeichner kann nicht mit einer Nummer beginnen. Sie können jedoch weiterhin Zeichenfolgen verwenden.

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

Wenn Sie mit Punktnotation auf die Eigenschaften zugreifen, müssen Sie Bezeichner verwenden. Verwenden Sie stattdessen die eckige Klammer : Game.status[0][0].

Angesichts dieser Daten scheint ein Array jedoch sinnvoller zu sein.

var Game={
    "status": [
        [
            "val",
            "val",
            "val"
        ],
        [
            "val",
            "val",
            "val"
        ]
    ]
}
QUentin
quelle
Dies würde es Ihnen immer noch nicht erlaubenGame.status[0].0
JaredMcAteer
16
Nein, wird aber erlauben Game.status[0][0].
Amadan
4
@OriginalSyn Es ist unmöglich, ´Game.status [0] .0´ zu haben, da Javascript nur zulässt, dass Eigenschaftsnamen mit einem Buchstaben oder einem Unterstrich beginnen, wenn Sie die Punktnotation verwenden möchten. Daran führt kein Weg vorbei.
Zatatatata
1
Vielen Dank für die Antwort, genau das, wonach ich gesucht habe. Ehrlich gesagt, ich habe keine Ahnung, warum ich anfangs nicht an ein Array gedacht habe - ich werde es dem Einfrieren des Gehirns zuschreiben.
Zar
@ Quentin, You aren't using JSON though. You have a JavaScript object literal. ist der einzige Unterschied der var =oder gibt es mehr Unterschiede zwischen JSON und einem JS-Objektliteral? Ist ein JS-Objekt im Grunde JSON in einer Variablen gespeichert?
Andre Bulatov
6

Zunächst einmal ist es nicht JSON: JSON schreibt vor, dass alle Schlüssel Zeichenfolgen sein müssen.

Zweitens machen reguläre Arrays, was Sie wollen:

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

wird funktionieren, wenn Sie verwenden Game.status[0][0]. Sie können keine Zahlen mit der Punktnotation ( .0) verwenden.

Alternativ können Sie die Zahlen (dh { "0": "val" }...) angeben. Sie haben einfache Objekte anstelle von Arrays, aber die gleiche Syntax funktioniert.

Amadan
quelle
5

Wahrscheinlich brauchen Sie ein Array?

var Game = {

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

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

Wenn der Name einer Javascript-Objekteigenschaft weder mit einem Unterstrich noch mit einem Buchstaben beginnt, können Sie die Punktnotation (wie Game.status[0].0) nicht verwenden, und Sie müssen die alternative Notation verwenden Game.status[0][0].

Eine andere Anmerkung: Brauchen Sie es wirklich, um ein Objekt innerhalb des Status-Arrays zu sein? Wenn Sie das Objekt wie ein Array verwenden, verwenden Sie stattdessen ein echtes Array.

zatatatata
quelle
2

JSON regelt den Schlüsseltyp als Zeichenfolge. Der Zweck besteht darin, die Punktnotation für den Zugriff auf die Mitglieder des Objekts zu unterstützen.

Beispiel: Person = {"Größe": 170, "Gewicht": 60, "Alter": 32}. Sie können auf Mitglieder nach person.height, person.weight usw. zugreifen. Wenn JSON Werteschlüssel unterstützt, sieht es wie person.0, person.1, person.2 aus.

Huiguorou
quelle
1
Ich sehe nicht, was mit Person.1, Person.2 usw. falsch ist.
Anshul
0

Wie wäre es mit

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

Funktioniert einer davon?

PS: Was Sie in Ihrer Frage haben, ist ein Javascript-Objekt, kein JSON. JSON ist die 'String'-Version eines Javascript-Objekts.

Willem Mulder
quelle
"JSON ist die 'String'-Version eines Javascript-Objekts." Das ist nicht wahr. Ein JSON-Objekt ist eine Teilmenge eines JavaScript-Objekts. Ansonsten haben Sie Recht, dass es sich um ein JavaScript-Objekt handelt, da es nicht der JSON-Spezifikation entspricht
JaredMcAteer
JSON ist eine Teilmenge der JavaScript- Objektliteralnotation, und ein JSON-Objekt ist ein Datentyp, der in JSON ausgedrückt werden kann.
Quentin
@OriginalSyn: Nun, nicht wirklich. JSON ist ein "austauschbares" Format und wird als sprachunabhängiges Zeichenfolgenformat verwendet. Die meisten Sprachen können JSON analysieren und in Javascript wird es zu einem Javascript-Objekt. Siehe benalman.com/news/2010/03/theres-no-such-thing-as-a-json .
Willem Mulder
1
@OriginalSyn: In JavaScript sind Objektliterale niemals JSON, da JSON immer eine Zeichenfolge ist. Objektliterale sind keine Zeichenfolgen. Der Begriff "JSON-Objekt" ist nicht sinnvoll, da etwas nicht sowohl "JSON" - eine Zeichenfolge als auch ein "Objekt" - eine Nicht-Zeichenfolge sein kann.
nnnnnn
0

JSON ist "JavaScript Object Notation". JavaScript gibt an, dass seine Schlüssel Zeichenfolgen oder Symbole sein müssen.

Das folgende Zitat aus MDN Docs verwendet die Begriffe "Schlüssel / Eigenschaft", um sich auf das zu beziehen, was ich häufiger als "Schlüssel / Wert" höre.

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

In JavaScript können Objekte als Sammlung von Eigenschaften angesehen werden. Mit der Objektliteral-Syntax wird ein begrenzter Satz von Eigenschaften initialisiert. Dann können Eigenschaften hinzugefügt und entfernt werden. Eigenschaftswerte können Werte eines beliebigen Typs sein, einschließlich anderer Objekte, wodurch komplexe Datenstrukturen erstellt werden können. Eigenschaften werden anhand von Schlüsselwerten identifiziert. Ein Schlüsselwert ist entweder ein String- oder ein Symbolwert.

2540625
quelle