Welche Zeichen sind in einem JSON-Schlüsselnamen gültig / ungültig?

151

Gibt es verbotene Zeichen in Schlüsselnamen für JavaScript-Objekte oder JSON-Zeichenfolgen? Oder Charaktere, die entkommen müssen?

Um genauer zu sein, möchte ich "$", "-" und Leerzeichen in Schlüsselnamen verwenden.

Christophe
quelle
Ich denke, diese Antwort hat teilweise mit der Art und Weise zu tun, wie Sie codieren. In UTF8 sind beispielsweise andere Zeichen als in ANSI zulässig.
Invalidysntax
4
Sie können jeden gewünschten 'Schlüssel' in JS mit der obj['whatever']Notation verwenden. Für die obj.whateverVersion können jedoch nur reguläre alphanumerische Schlüssel verwendet werden .
Marc B
4
@invalidsyntax: JSON ist per Definition Unicode. Außerdem ist ANSI keine Codierung, sondern ein Zeichensatz. Daher sollte der Vergleich Unicode-gegen-ANSI und nicht UTF-8-gegen-ANSI sein.
Marcelo Cantos
1
Alte Diskussion, aber ASCII (worauf sich ANSI oft bezieht) ist eine Kodierung und definiert darüber hinaus auch einen Zeichensatz.
Trinidad

Antworten:

167

Nein. Jede gültige Zeichenfolge ist ein gültiger Schlüssel. Es kann sogar "so lange dauern, bis Sie entkommen:

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

Es besteht möglicherweise die Möglichkeit, dass Sie beim Laden solcher Werte in einige Sprachen Schwierigkeiten haben, die versuchen, Schlüssel mit Objektfeldnamen zu verknüpfen. Ich kenne solche Fälle jedoch nicht.

Marcelo Cantos
quelle
Vielen Dank! Irgendwelche anderen Charaktere, die entkommen müssten? Wie: oder; ?
Christophe
11
Nicht die. Was auch immer in JavaScript entkommen muss, benötigt es im Allgemeinen in JSON. Am besten aus dem Maul des Pferdes bei json.org. Es dauert ungefähr eine Minute, um die gesamte Spezifikation durchgehend zu lesen.
Marcelo Cantos
3
Dies ist imho keine gute Antwort. Welche Art von Charakteren muss entkommen? Welche Zeichen können entkommen, müssen aber nicht entkommen?
Daniel W.
Kann jemand klären, ob dies Dinge wie das Unicode-Nullzeichen (U + 0000, einfaches "Nullbyte" in UTF-8) usw. enthält? Sowohl json.org als auch das verknüpfte offizielle / formelle ECMA-Spezifikations-PDF scheinen zu implizieren, dass diese in JSON gültig sind, auch in ihrer wörtlichen Form (nicht nur in der \u four-hex-digitsForm).
mtraceur
1
@OutofOrbit Kannst du es einfach in ein untypisiertes Objekt laden?
Marcelo Cantos
54

Die folgenden Zeichen müssen in JSON-Daten maskiert werden, um Probleme zu vermeiden

'einfaches Zitat

Zitat

\ backslash

Alle Steuerzeichen wie \ n \ t

JSON Parser kann Ihnen beim Umgang mit JSON helfen.

EDIT: Hier ist ein Ersatz-JSON-Parser, da der OP-Link nicht mehr funktioniert

Arun Rana
quelle
5
Hallo Arun, einfache Anführungszeichen müssen nicht maskiert werden. Wenn Sie ihnen entkommen, wird bei strengen JSON-Parsern eine Ausnahme ausgelöst. Weitere Informationen finden Sie im Abschnitt "Zeichenfolgen" von json.org. Natürlich müssen Sie diese jedoch in einer JSON-Zeichenfolge (aber nicht im JSON selbst) maskieren .
Alex KeySmith
5
@AlexKey du hast vollkommen recht! Arun, Sie können dies auf jsonlint.com überprüfen, indem Sie den JSON { "singlequotetest": "something here isn\'t right"}gegen{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be
@Arun Rana - keine Sorge.
Alex KeySmith
3
{"* ~ @ # $% ^ & * () _ + => <? /": "ist ein gültiger json"}
Abhi
45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos
12

Es ist erwähnenswert, dass das Starten der Schlüssel mit Zahlen zwar gültig ist, jedoch einige unbeabsichtigte Probleme verursachen kann.

Beispiel:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround
Karns
quelle
6
Ich hoffe wirklich, dass sie in diesem Zeitalter von Microsoft 2017/18 all die Schmerzen bedauern, die sie verursacht haben.
Montag,
1
Schauen Sie sich die Metrik-ID-Parameter an: dev.applicationinsights.io/apiexplorer/… --- 15 oder 20 ihrer Felder haben mehrere Schrägstriche in ihren json-Feldnamen. Während die Karns-Lösung für ein bestimmtes Feld funktioniert, kann ich sie anscheinend nicht für ein Unterfeld von 1tile zum Laufen bringen. ZB kehrt ein nachfolgender Punkt für mich undefiniert zurück.
Jon Luzader
Warum wird IE dort erwähnt? Bezeichner, die mit numerisch beginnen, sind in jeder ECMAScript-Implementierung unzulässig.
M93a
@ m93a IE ist nicht als Akronym für Internet Explorer gedacht ... schlechte Wortwahl: /
Karns
Dies sollte die beste Antwort sein
Joe Elia
7

Unicode-Codepunkte U + D800 bis U + DFFF müssen vermieden werden: Sie sind in Unicode ungültig, da sie für UTF-16-Ersatzpaare reserviert sind. Einige JSON-Encoder / -Decoder ersetzen sie durch U + FFFD. Sehen Sie zum Beispiel, wie die Go-Sprache und ihre JSON-Bibliothek mit ihnen umgehen .

Vermeiden Sie daher "\ uD800" bis "\ uDFFF" allein (nicht in Ersatzpaaren).

Dolmen
quelle