Gibt es einen praktischen Grund, Strings in Anführungszeichen für JSON Schlüssel zu verwenden?
-
25-09-2019 - |
Frage
Nach Crockford json.org , ein JSON Objekt besteht aus Mitglieder , die von aufgebaut ist Paare .
Jedes Paar von einem string gemacht wird und Wert , mit einer string als definiert sind:
Ein String ist eine Folge von null oder mehr Unicode-Zeichen, in doppelt verpackt Zitate, mit Backslash entkommt. EIN Zeichen wird als eine einzige dargestellt Zeichenkette. Ein String ist sehr ähnlich wie ein C oder Java-String.
Aber in der Praxis der meisten Programmierer wissen nicht einmal, dass ein JSON-Schlüssel sollte durch doppelte Anführungszeichen gesetzt werden, da die meisten Browser nicht die Verwendung von doppelten Anführungszeichen erforderlich.
macht es keinen Sinn in doppelten Anführungszeichen rund um Ihre JSON zu stören?
Gültiges Beispiel:
{
"keyName" : 34
}
Im Gegensatz zum ungültig:
{
keyName : 34
}
Lösung
Der wahre Grund, warum JSON Schlüssel in Anführungszeichen gesetzt werden sollte, verlässt sich in der Semantik von Identifikatoren von ECMAScript 3.
Reservierte Wörter nicht als Eigenschaftsnamen verwendet werden können, in Objektliteralen ohne Anführungszeichen, zum Beispiel:
({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
Während, wenn Sie Anführungszeichen verwenden die Eigenschaftsnamen sind gültig:
({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok
Die eigene Crockford erklärt es in diesem Vortrag , sie wollten die JSON-Standard einfach zu halten, und sie würden nicht wie alle diese semantischen Beschränkungen auf, es haben:
....
Das war, als wir das entdeckt unquoted Name Problem. Es stellt sich heraus ECMA Script 3 ist ein reservierter Whack Wortpolitik. Reservierte Wörter müssen in der Schlüsselposition zitiert, das ist wirklich ein Ärgernis. Als ich um zu formulizing diese in einem Standard, I wollte nicht alle die haben zu setzen reservierte Worte in der Norm, weil es aussehen würde wirklich dumm.
Zu der Zeit, ich habe versucht zu überzeugen, Leute: Ja, Sie können schreiben Anwendungen in JavaScript, es ist geht tatsächlich an die Arbeit und es ist eine gute Sprache. Ich wollte nicht sagen, dann, zugleich: und Blick auf diese wirklich dumm, was sie taten! Also ich stattdessen beschlossen, lassen Sie sich einfach das Zitat Schlüssel.
Auf diese Weise wir müssen nicht sagen, jemand darüber, wie Whack es ist.Aus diesem Grund, an diesem Tag, Schlüssel zitiert in JSON.
...
Die ECMAScript 5th Edition Standard-korrigiert diese Fehler, jetzt in einer ES5 Implementierung, auch reservierte Wörter können ohne Anführungszeichen verwendet werden, in beiden, Objektliterale und Mitglied Zugang (obj.function
Ok in ES5).
Nur für das Protokoll, diese Norm in diesen Tagen durch Software-Anbieter implementiert wird, können Sie sehen, welche Browser umfassen diese Funktion auf diese Kompatibilitätstabelle (siehe reservierte Wörter als Eigenschaftsnamen )
Andere Tipps
Ja, es ist ungültig JSON und sonst in vielen Fällen abgelehnt werden, zum Beispiel jQuery 1.4+ einen Scheck hat die fehlschlagen unquoted JSON leise macht. Warum nicht kompatibel sein?
Lassen Sie uns ein anderes Beispiel:
{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }
... alle diese würde mit Anführungszeichen gültig sein, warum nicht im Einklang stehen und sie in allen Fällen verwenden, um die Möglichkeit eines Problems zu beseitigen?
Ein weiteres gängiges Beispiel in der Web-Entwickler Welt: Es gibt Tausende von Beispielen für ungültig HTML, die in den meisten Browsern macht ... das tut es dabei eine weniger schmerzhaft zu debuggen oder halten? Gar nicht, ganz im Gegenteil.
Auch @ Matthew macht den besten Punkt von allen in den Kommentaren unten, dieses schon fehlschlägt, einen Syntaxfehler mit JSON.parse()
in allen gängigen Browsern (und alle anderen nicht notierten Tasten werfen dass es richtig) zu implementieren, Sie können es testen hier .
YAML, die in der Tat ist ein Ober von JSON, unterstützt, was Sie tun wollen. Obwohl seine ein Obermenge, es können Sie es so einfach halten, wie Sie wollen.
YAML ist ein Hauch frischer Luft, und es kann sich lohnen, Ihre Zeit, einen Blick darauf zu werfen. Der beste Ort zum Start ist hier: http://en.wikipedia.org/wiki/YAML
Es gibt Libs für jede Sprache unter der Sonne, einschließlich JS, zB https://github.com/ nodeca / js-yaml