Gibt es einen praktischen Grund, Zeichenfolgen in Anführungszeichen für JSON-Schlüssel zu verwenden?

87

Laut Crockfords json.org besteht ein JSON- Objekt aus Mitgliedern , die aus Paaren bestehen .

Jedes Paar besteht aus einer Zeichenfolge und einem Wert , wobei eine Zeichenfolge wie folgt definiert ist:

Eine Zeichenfolge ist eine Folge von null oder mehr Unicode-Zeichen, die in doppelte Anführungszeichen gesetzt werden und Backslash-Escapezeichen verwenden. Ein Zeichen wird als einzelne Zeichenfolge dargestellt. Eine Zeichenfolge ähnelt stark einer C- oder Java-Zeichenfolge.

In der Praxis wissen die meisten Programmierer jedoch nicht einmal, dass ein JSON-Schlüssel von doppelten Anführungszeichen umgeben sein sollte, da die meisten Browser keine doppelten Anführungszeichen benötigen.

Ist es sinnvoll, sich die Mühe zu machen, Ihren JSON in doppelte Anführungszeichen zu setzen?

Gültiges Beispiel:

{
  "keyName" : 34
}

Im Gegensatz zum ungültigen:

{
   keyName : 34
}
Mark Rogers
quelle
20
"Warum sich die Mühe machen, es richtig zu machen?" Dies ist die Art von faulem Denken, die zu Websites führt, die mit ungültigem Markup beladen sind. Zukunftssichere Code , falls einige Browser nicht doppelte Anführungszeichen erforderlich.
Meagar
21
"Warum sich die Mühe machen, es richtig zu machen?" - Warum sich die Mühe machen, einer Konvention zu folgen, die sonst niemand tut, wenn es keinen wirklichen Nutzen gibt? Vielleicht verwechseln Sie faules Denken mit Pragmatismus.
Mark Rogers
15
@Mark - "das macht sonst niemand" ... woher hast du diese Idee? Der in jede wichtige Plattform integrierte JSON-Serializer führt ordnungsgemäße Zitate durch.
Nick Craver
7
@Mark Rogers PHP Die json_encode-Funktion erzeugt einen gültigen JSON, beispielsweise mit Zeichenfolgen in doppelten Anführungszeichen. Vielleicht denken Sie an Objektliterale in JavaScript? Es stimmt, dass diese funktionieren, ohne die Schlüssel zu zitieren, aber das ist nicht JSON.
JAL
9
Als ich dies vor Jahren veröffentlichte, war ich verwirrt über den Unterschied zwischen JSON und Objektliteralnotation, wie @JAL vorschlug. Die beiden haben eine sehr ähnliche Syntax, was letztendlich zu Verwirrung bei der Beschreibung des Problems führte.
Mark Rogers

Antworten:

155

Der wahre Grund, warum JSON-Schlüssel in Anführungszeichen stehen sollten, beruht auf der Semantik der Bezeichner von ECMAScript 3.

Reservierte Wörter können in Objektliteralen ohne Anführungszeichen nicht als Eigenschaftsnamen verwendet werden. Beispiel:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

Wenn Sie Anführungszeichen verwenden, sind die Eigenschaftsnamen gültig:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

Der eigene Crockford erklärt es in diesem Vortrag , sie wollten den JSON-Standard einfach halten und sie möchten nicht all diese semantischen Einschränkungen haben:

....

Zu diesem Zeitpunkt entdeckten wir das Problem des nicht zitierten Namens. Es stellt sich heraus, dass ECMA Script 3 eine Whack-Richtlinie für reservierte Wörter enthält. Reservierte Wörter müssen an der Schlüsselposition zitiert werden, was wirklich ein Ärgernis ist. Als ich dazu kam, dies in einen Standard zu formulieren, wollte ich nicht alle reservierten Wörter in den Standard einfügen müssen, weil es wirklich dumm aussehen würde.

Zu der Zeit habe ich versucht, die Leute zu überzeugen: Ja, Sie können Anwendungen in JavaScript schreiben, es wird tatsächlich funktionieren und es ist eine gute Sprache. Ich wollte also nicht gleichzeitig sagen: und sieh dir diese wirklich dumme Sache an, die sie getan haben! Also habe ich beschlossen, stattdessen nur die Schlüssel zu zitieren.
Auf diese Weise müssen wir niemandem erzählen, wie verrückt es ist.

Aus diesem Grund werden Schlüssel bis heute in JSON zitiert.

...

Der ECMAScript 5th Edition Standard behebt dieses Problem. In einer ES5-Implementierung können jetzt sogar reservierte Wörter ohne Anführungszeichen verwendet werden, sowohl in Objektliteralen als auch im Mitgliederzugriff (obj.function in Objektliteralen Ok in ES5).

Nur zur Veranschaulichung: Dieser Standard wird derzeit von Softwareanbietern implementiert. In dieser Kompatibilitätstabelle können Sie sehen, welche Browser diese Funktion enthalten (siehe Reservierte Wörter als Eigenschaftsnamen ).

CMS
quelle
1
@ Mark, du bist willkommen. Beachten Sie, dass JSON einfach ein sprachunabhängiges Datenaustauschformat ist, auch wenn seine Syntax von der Javascript Object Literal-Syntax inspiriert wurde, gibt es Unterschiede zwischen ihnen (viel mehr als nur die zitierten Schlüssel).
CMS
2
@CMS, warum müssen es also nur doppelte Anführungszeichen sein? Warum sind einfache Anführungszeichen in JSON ungültig?
Pacerier
1
Einfache Anführungszeichen sind nicht zulässig, um den JSON-Standard so einfach wie möglich zu halten. JSON muss nur eine Teilmenge von Javascript sein, es muss nicht so viel Javascript wie möglich implementiert werden.
Thomasrutter
Die JSON5-Superset-Spezifikation entspricht der ES5-Syntax und unterstützt daher unter anderem nicht zitierte Schlüssel. Die Bibliothek verfügt über kompatible parseund stringifyMethoden.
Inigo
In diesem Link zur Kompatibilitätstabelle (am Ende der Antwort) befindet sich der Eintrag " Reservierte Wörter" im Abschnitt " Literalerweiterungen" Objekt / Array ". Und TL; DR, alle aufgelisteten Browser (alle, von denen Sie gehört haben, und ungefähr 20 weitere) sagen alle "Ja".
i336_
16

Ja, es ist ungültiges JSON und wird in vielen Fällen anderweitig abgelehnt. Beispielsweise verfügt jQuery 1.4+ über eine Prüfung, die dazu führt, dass nicht zitiertes JSON stillschweigend fehlschlägt. Warum nicht konform sein?

Nehmen wir ein anderes Beispiel:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

... all dies wäre mit Anführungszeichen gültig. Warum nicht konsistent sein und sie in allen Fällen verwenden, um die Möglichkeit eines Problems auszuschließen?

Ein weiteres häufiges Beispiel in der Welt der Webentwickler: Es gibt Tausende von Beispielen für ungültiges HTML, das in den meisten Browsern gerendert wird. Ist das Debuggen oder Verwalten dadurch weniger schmerzhaft? Überhaupt nicht, ganz im Gegenteil.

Auch @ Matthew macht den besten Punkt von allen in den Kommentaren unten, dies schlägt bereits fehl, nicht zitierte Schlüssel werfen einen Syntaxfehler mit JSON.parse()in allen gängigen Browsern (und allen anderen, die es korrekt implementieren), können Sie es hier testen .

Nick Craver
quelle
Ja, ich hatte einige alte Ajax-Apps, die schonky json serverseitig generierten, was beim Upgrade auf jquery 1.4 fehlschlug, da keine doppelten Anführungszeichen um Schlüsselnamen vorhanden waren.
JAL
Vielleicht möchten Sie hinzufügen, dass alle gängigen Browser dies JSON.parseebenfalls korrekt ablehnen.
Matthew Flaschen
Ich bin gespannt, in welchem ​​Fall genau JQuery 1.4 mit dieser Art von ungültigem JSON stillschweigend versagt.
Mark Rogers
1
@Mark - In jedem Fall ist es nicht richtig in Anführungszeichen gesetzt oder hat ungültige Zeichen ... im Grunde schlägt es mit jedem ungültigen JSON fehl.
Nick Craver
Das ist interessant, das war nicht meine Erfahrung mit JQuery 1.4. Außerdem glaube ich nicht, dass jquery für das Erstellen von json-Objekten verantwortlich ist. Ist das nicht das, was der Javascript-Interpreter des Browsers tut? Beziehen Sie sich auf die Deserialisierung von Jquery json?
Mark Rogers
-3

YAML, eine Obermenge von JSON, unterstützt, was Sie tun möchten. Obwohl es eine Obermenge ist, können Sie es so einfach halten, wie Sie möchten.

YAML ist ein Hauch frischer Luft und es kann sich lohnen, sich das anzuschauen. Der beste Startpunkt ist hier: http://en.wikipedia.org/wiki/YAML

Es gibt Bibliotheken für jede Sprache unter der Sonne, einschließlich JS, z. B. https://github.com/nodeca/js-yaml

user1649339
quelle
10
YAML ist keine Obermenge von JSON.
John Gibb
Für Informationen darüber, warum: stackoverflow.com/questions/25974485/…
Ben Seite