Quali caratteri sono validi / non validi in un nome chiave JSON?


151

Ci sono caratteri proibiti nei nomi delle chiavi, per oggetti JavaScript o stringhe JSON? O personaggi che devono essere evasi?

Per essere più specifici, mi piacerebbe usare "$", "-" e lo spazio nei nomi delle chiavi.


Penso che in parte questa risposta abbia a che fare con il modo in cui stai codificando. Ad esempio, UTF8 ha caratteri diversi consentiti rispetto a ANSI.
invalidsyntax,

4
Puoi usare qualsiasi 'chiave' desiderata in JS usando la obj['whatever']notazione. Ma solo le normali chiavi alfanumeriche possono essere utilizzate per la obj.whateverversione.
Marc B,

4
@invalidsyntax: JSON è Unicode per definizione. Inoltre, ANSI non è una codifica, è un set di caratteri, quindi il confronto dovrebbe essere Unicode-vs-ANSI, non UTF-8-vs-ANSI.
Marcelo Cantos,

1
Vecchia discussione, tuttavia, ASCII (a cui la gente fa spesso riferimento ANSI) è una codifica e per di più definisce anche un set di caratteri.
Trinidad,

Risposte:


168

No. Qualsiasi stringa valida è una chiave valida. Può anche avere "fino a quando fuggirai:

{"The \"meaning\" of life":42}

Forse c'è una possibilità che incontrerai difficoltà nel caricare tali valori in alcune lingue, che provano ad associare le chiavi ai nomi dei campi degli oggetti. Non conosco casi simili, comunque.


Grazie! Qualche altro personaggio che dovrebbe essere evaso? Come: o; ?
Christophe,

11
Non quelli. Qualunque cosa abbia bisogno di scappare in JavaScript, generalmente ne ha bisogno in JSON. Meglio prenderlo dalla bocca del cavallo, però, su json.org. Ci vuole circa un minuto per leggere l'intera specifica end-to-end.
Marcelo Cantos,

3
Questa non è una buona risposta imho. Che tipo di personaggi devono essere evasi? Quali personaggi possono essere sfuggiti, ma non è necessario sfuggire?
Daniel W.

Qualcuno può chiarire se questo include cose come il carattere null Unicode (U + 0000, semplice "byte null" in UTF-8), ecc? Sia il file json.org che il PDF delle specifiche ECMA ufficiale / formale collegato sembrano implicare che sì, quelli sono validi in JSON, anche nelle loro forme letterali (non solo nel \u four-hex-digitsmodulo).
mtraceur,

1
@OutofOrbit Puoi semplicemente caricarlo in un oggetto non tipizzato?
Marcelo Cantos,

54

I caratteri seguenti devono essere sottoposti a escape nei dati JSON per evitare problemi

'virgoletta singola

" citazione

barra rovesciata

tutti i personaggi di controllo come \ n \ t

JSON Parser può aiutarti a gestire JSON.

EDIT: ecco un parser JSON sostitutivo poiché il link di OP è morto


5
Ciao Arun, non è necessario sfuggire alle virgolette singole. Infatti, la loro fuga provocherà un'eccezione nei rigorosi parser JSON. Fare riferimento alla sezione string di json.org Naturalmente, tuttavia, sarà necessario evitarli quando si è all'interno di una stringa JSON (ma non lo stesso JSON).
Alex KeySmith

5
@AlexKey hai perfettamente ragione! Arun, puoi verificarlo su jsonlint.com testando il JSON { "singlequotetest": "something here isn\'t right"}contro{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be

@Arun Rana - nessuna preoccupazione.
Alex KeySmith,

3
{"* ~ @ # $% ^ & * () _ + => <? /": "è un json valido"}
Abhi,

45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos,

12

Vale la pena ricordare che mentre l'avvio delle chiavi con i numeri è valido, potrebbe causare problemi non intenzionali.

Esempio:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround

6
Spero davvero che, nell'età di Microsoft 2017/18, siano dispiaciuti di tutto il dolore che hanno causato.
Monsto

1
Guarda i loro parametri ID metriche: dev.applicationinsights.io/apiexplorer/… --- 15 o 20 dei loro campi hanno più barre in avanti nei nomi dei loro campi json. Mentre la soluzione Karns funziona per un campo specifico, non riesco a farlo funzionare per un sottocampo di 1 file. Ad esempio, un punto successivo ritorna indefinito per me.
Jon Luzader il

Perché IE è menzionato lì? Gli identificatori che iniziano con un numero sono illegali in ogni implementazione di ECMAScript.
m93a,

@ m93a IE non è inteso come acronimo di Internet Explorer ... cattiva scelta di parole: /
karns

Questa dovrebbe essere la risposta migliore
Joe Elia

7

I codici codificati Unicode da U + D800 a U + DFFF devono essere evitati: non sono validi in Unicode perché sono riservati per coppie surrogate UTF-16. Alcuni codificatori / decodificatori JSON li sostituiranno con U + FFFD. Vedi ad esempio come la lingua Go e la sua libreria JSON li gestiscono .

Quindi evita "\ uD800" su "\ uDFFF" da solo (non in coppie surrogate).

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.