Utilizzo del numero come "indice" (JSON)


89

Recentemente ho iniziato a scavare in JSON e attualmente sto cercando di utilizzare un numero come "identificatore", che non funziona molto bene. foo:"bar"funziona bene, mentre 0:"bar"no.

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

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

C'è un modo per farlo nel modo seguente? Qualcosa come Game.status[0].0renderebbe la mia vita molto più facile. Ovviamente ci sono altri modi per aggirarlo, ma questo è il preferito.


3
La ragione di ciò è che in JavaScript, come molti altri linguaggi, il nome di una proprietà / variabile non può iniziare con un numero, ma solo con $, _, az e AZ. Perché non è Game.status[0]un array? Allora la tua sintassi sarebbe Game.status[0][0].
nikc.org

Risposte:


132

JSON consente solo che i nomi delle chiavi siano stringhe. Queste stringhe possono essere costituite da valori numerici.

Tuttavia, non stai usando JSON. Hai un oggetto JavaScript letterale. È possibile utilizzare gli identificatori per le chiavi, ma un identificatore non può iniziare con un numero. Puoi comunque usare le stringhe.

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

Se accedi alle proprietà con la notazione a punti, devi utilizzare gli identificatori. Utilizzare la notazione parentesi quadra invece: Game.status[0][0].

Ma dati questi dati, un array sembrerebbe avere più senso.

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

Questo non ti permetterebbe ancora di farloGame.status[0].0
JaredMcAteer

16
No, ma permetterà Game.status[0][0].
Amadan

4
@OriginalSyn è impossibile avere ´Game.status [0] .0´ perché Javascript consente solo ai nomi delle proprietà di iniziare con una lettera o un trattino basso se si desidera utilizzare la notazione del punto. Non c'è modo di aggirarlo.
zatatatata

1
Grazie mille per la risposta, esattamente quello che stavo cercando. Onestamente, non ho idea del motivo per cui non ho pensato a un array con cui iniziare - darò la colpa al congelamento del cervello.
Zar

@Quentin, You aren't using JSON though. You have a JavaScript object literal. è l'unica differenza var =o ci sono più differenze tra JSON e un oggetto letterale JS? Un oggetto JS è fondamentalmente JSON archiviato in una variabile?
Andre Bulatov

7

Prima di tutto, non è JSON: JSON impone che tutte le chiavi debbano essere stringhe.

In secondo luogo, gli array regolari fanno quello che vuoi:

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

funzionerà, se usi Game.status[0][0]. Non è possibile utilizzare numeri con la notazione del punto ( .0).

In alternativa, puoi citare i numeri (cioè { "0": "val" }...); avrai oggetti semplici invece di Arrays, ma la stessa sintassi funzionerà.


5

Probabilmente ti serve un array?

var Game = {

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

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

3

Quando il nome di una proprietà di un oggetto Javascript non inizia con un carattere di sottolineatura o una lettera, non puoi usare la notazione punto (come Game.status[0].0) e devi usare la notazione alternativa, che è Game.status[0][0].

Una nota diversa, hai davvero bisogno che sia un oggetto all'interno dell'array di stato? Se stai usando l'oggetto come un array, perché non usare invece un vero array?


2

JSON regola il tipo di chiave in modo che sia stringa. Lo scopo è supportare la notazione del punto per accedere ai membri dell'oggetto.

Ad esempio, person = {"height": 170, "weight": 60, "age": 32}. Puoi accedere ai membri in base a persona.altezza, persona.peso, ecc. Se JSON supporta le chiavi valore, apparirà come persona.0, persona.1, persona.2.


1
Non vedo cosa c'è di sbagliato in person.1, person.2 ecc.?
Anshul

1

JSON è "JavaScript Object Notation". JavaScript specifica che le sue chiavi devono essere stringhe o simboli.

La seguente citazione da MDN Docs utilizza i termini "chiave / proprietà" per fare riferimento a ciò che sento più spesso definito come "chiave / valore".

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

In JavaScript, gli oggetti possono essere visti come una raccolta di proprietà. Con la sintassi letterale dell'oggetto, viene inizializzato un insieme limitato di proprietà; quindi le proprietà possono essere aggiunte e rimosse. I valori delle proprietà possono essere valori di qualsiasi tipo, inclusi altri oggetti, che consentono di creare strutture di dati complesse. Le proprietà vengono identificate utilizzando valori chiave. Un valore chiave è un valore String o Symbol.


0

Che dire

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

Uno di questi funziona?

PS: quello che hai nella tua domanda è un oggetto Javascript, non JSON. JSON è la versione "stringa" di un oggetto Javascript.


"JSON è la versione 'stringa' di un oggetto Javascript." Quello non è vero. Un oggetto JSON è un sottoinsieme di un oggetto JavaScript. Altrimenti hai ragione che è un oggetto JavaScript poiché non è conforme alle specifiche JSON
JaredMcAteer

JSON è un sottoinsieme della notazione letterale dell'oggetto JavaScript e un oggetto JSON è un tipo di dati che può essere espresso in JSON.
Quentin

@OriginalSyn: Beh, non proprio. JSON è un formato "intercambiabile" e viene utilizzato come formato stringa indipendente dalla lingua. La maggior parte delle lingue può analizzare JSON e in Javascript si trasformerà in un oggetto Javascript. Vedi benalman.com/news/2010/03/theres-no-such-thing-as-a-json .
Willem Mulder

1
@OriginalSyn: in JavaScript, i letterali oggetto non sono mai JSON, perché JSON è sempre una stringa. I letterali oggetto non sono stringhe. Il termine "oggetto JSON" non ha senso, perché qualcosa non può essere sia "JSON", una stringa, e un "oggetto", una non stringa.
nnnnnn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.