Müssen die JSON-Schlüssel in Anführungszeichen gesetzt werden?

233

Beispiel: Ist der folgende Code für die JSON-Spezifikation gültig ?

{
    precision: "zip"
}

Oder sollte ich immer die folgende Syntax verwenden? (Und wenn ja, warum?)

{
    "precision": "zip"
}

Ich habe in den JSON-Spezifikationen nicht wirklich etwas darüber gefunden. Obwohl sie in ihren Beispielen Anführungszeichen um ihre Schlüssel verwenden.

christianvuerings
quelle

Antworten:

145

Ja, Sie benötigen Anführungszeichen. Dies soll es einfacher machen und vermeiden, dass eine andere Escape-Methode für reservierte Javascript-Schlüsselwörter erforderlich ist, d {for:"foo"}. H.

Cobbal
quelle
12
Die Anführungszeichen sind in vielen Situationen nicht einfacher, z. B. bei Konfigurationsdateien, die von Hand bearbeitet werden. Das Unglückliche daran, dass JSON als nahezu universelles Austauschformat verwendet (und missbraucht) wird, ist, dass es spezifische Funktionen für Javascript enthält.
Miguel
12
Echter Grund - überprüfen Sie auch diese Antwort - stackoverflow.com/questions/4201441/…
TechMaze
3
Tl; dr: Sie wollten sich nicht mit der ECMAScript-Beschränkung für (nicht zitierte) reservierte Schlüsselwörter als Schlüssel befassen, daher mussten sie nur alle Schlüssel zitieren.
BallpointBen
136

Sie verwenden zu Recht Zeichenfolgen als Schlüssel. Hier ist ein Auszug aus RFC 4627 - Die Anwendung / json Medientyp für JavaScript Object Notation (JSON)

2.2. Objekte

Eine Objektstruktur wird als ein Paar geschweifter Klammern dargestellt, die null oder mehr Name / Wert-Paare (oder Elemente) umgeben. Ein Name ist eine Zeichenfolge . Nach jedem Namen steht ein einzelner Doppelpunkt, der den Namen vom Wert trennt. Ein einzelnes Komma trennt einen Wert von einem folgenden Namen. Die Namen innerhalb eines Objekts sollten eindeutig sein.

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2.5. Saiten

Die Darstellung von Zeichenfolgen ähnelt den Konventionen, die in der C-Familie der Programmiersprachen verwendet werden. Eine Zeichenfolge beginnt und endet mit Anführungszeichen. [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Lesen Sie den ganzen RFC hier .

PatrikAkerstrand
quelle
11
Und um den Gedanken zu beenden, heißt es in Abschnitt 2.5 : A string begins and ends with quotation marks..
Rakslice
13

Ab 2.2. Objekte

Eine Objektstruktur wird als ein Paar geschweifter Klammern dargestellt, die null oder mehr Name / Wert-Paare (oder Elemente) umgeben. Ein Name ist eine Zeichenfolge.

und ab 2.5. Saiten

Eine Zeichenfolge beginnt und endet mit Anführungszeichen.

Also würde ich sagen, dass gemäß dem Standard: Ja, Sie sollten immer den Schlüssel zitieren (obwohl einige Parser verzeihender sein können)

Cebjyre
quelle
7

Ja, Anführungszeichen sind obligatorisch. http://json.org/ sagt:

string
    ""
    " chars "

quelle
0

Ja, das tun sie. Wenn Sie etwas anderes benötigen, checken Sie JSON5 aus .

JSON5 ist eine Obermenge von JSON, die ES5-Syntax ermöglicht, einschließlich:

  • nicht zitierte Eigenschaftsschlüssel
  • Zeichenfolgen in einfachen Anführungszeichen, Escapezeichen und mehrzeiligen Zeichenfolgen
  • alternative Zahlenformate
  • Bemerkungen
  • extra Leerzeichen

Die JSON5-Referenzimplementierung ( json5npm-Paket ) bietet ein JSON5Objekt mit Methoden parseund stringifyMethoden mit denselben Argumenten und derselben Semantik wie das integrierte JSONObjekt.

Inigo
quelle
-2

Da Sie die gepunktete Notation "parent.child" eingeben können und nicht "parent [child"] eingeben müssen, was ebenfalls gültig und nützlich ist, würde ich sagen, dass beide Möglichkeiten technisch akzeptabel sind. Die Parser sollten alle in beide Richtungen gut funktionieren. Wenn Ihr Parser keine Anführungszeichen für Schlüssel benötigt, ist es wahrscheinlich besser, diese nicht zu setzen (spart Platz). Es ist sinnvoll, sie als Zeichenfolgen zu bezeichnen, da sie genau das sind. Da die eckigen Klammern Ihnen die Möglichkeit geben, Werte für Schlüssel zu verwenden, ist es durchaus sinnvoll, dies nicht zu tun. In Json können Sie setzen ...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

Ohne Probleme, wenn Sie einen Wert für einen Schlüssel benötigen und keiner in Anführungszeichen steht, funktioniert dies nicht. Wenn dies nicht der Fall ist, können Sie dies nicht. Sie benötigen also keine Anführungszeichen für Schlüssel. Auch wenn es richtig ist zu sagen, dass es sich um technische Zeichenfolgen handelt. Logik und Nutzung sprechen anders. Das Objekt {"someKey": "someValue"} für obj wird in unserem Beispiel auch nicht offiziell von der Konsole eines Browsers ausgeführt.

Meister James
quelle
2
Sowohl die akzeptierte Antwort als auch der RFC, der JSON definiert, besagen, dass die Anführungszeichen erforderlich sind.
Keith Thompson
Das ist wahr, aber es ist erwähnenswert, dass dies logischerweise nicht erforderlich ist. Ich nehme an, dass eine Ausgabe der JavaScript-Objektnotation von allen Browserkonsolen falsch ist, und wir sollten jemandem sagen, dass er das beheben soll. Möglicherweise ist das, was eine Browserkonsole für ein Objekt ausgibt, nicht JSON. Daher wird JSON, wie in der Spezifikation definiert, an den meisten Stellen nicht benötigt oder auf diese Weise implementiert. Jedenfalls wollte ich nur den Fall machen, der die Fakten in einem anderen Licht betrachtet. Vielleicht sollte die Spezifikation dann wirklich geändert werden. "Quoted Keys" wird einfach nirgendwo benötigt, was mir persönlich wichtig ist. (Es wird in der Praxis einfach nicht so verwendet.)
Meister James
2
Sie mischen drei verschiedene Dinge: JSON, JavaScript-Objektliterale und Konsolenausgabe der Browser-Entwicklertools. Wenn Sie Ihre objin die Konsole eingeben, zeigt der Browser eine für Menschen lesbare Darstellung des Objekts an. Es kann es als Objektliteral anzeigen (wie in Ihrem Beispiel), oder es kann eine andere Darstellung verwenden, sogar eine interaktive. JavaScript-Objektliterale erfordern keine Anführungszeichen um einen Schlüsselnamen, wenn der Schlüssel eine gültige Kennung und kein reserviertes Wort ist. JSON erfordert jedoch immer Anführungszeichen um Schlüsselnamen.
Michael Geary
3
objVersuchen Sie als weiteres Beispiel, anstatt in die Konsole zu tippen JSON.stringify(obj). Jetzt sehen Sie eine gültige JSON-Darstellung des Objekts mit dem angegebenen Schlüsselnamen. Umgekehrt versuchen Sie, festzustellen, ob eine Zeichenfolge JSON-gültig ist JSON.parse(string). Wenn die Schlüssel nicht in Anführungszeichen gesetzt sind, wird eine Ausnahme ausgelöst. Zum Beispiel JSON.parse('{"a":"b"}')wird erfolgreich sein, wird aber JSON.parse('{a:"b"}')fehlschlagen.
Michael Geary
1
OTOH, Ihre Verwendung var obj = {[keyName]:"someValue"};ist sehr interessant! Ich wusste nicht, dass Sie das in einem JavaScript-Objektliteral tun können. Eine kleine Überprüfung zeigt, dass dies in ES6 etwas Neues ist - in ES5 war dies nicht möglich.
Michael Geary