Die JSON-Spezifikation besagt, dass JSON ein Objekt oder ein Array ist. Im Falle eines Objekts,
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 später heißt es in der Spezifikation, dass eine Zeichenfolge in Anführungszeichen gesetzt ist.
Warum?
So,
{"Property1":"Value1","Property2":18}
und nicht
{Property1:"Value1",Property2:18}
Frage 1 : Warum nicht zulassen, dass der Name in den Name / Wert-Paaren nicht zitierte Bezeichner sind?
Frage 2 : Gibt es einen semantischen Unterschied zwischen den beiden obigen Darstellungen, wenn sie in Javascript ausgewertet werden?
javascript
json
Cheeso
quelle
quelle
eval()
(dh Javascript).Antworten:
Die Designphilosophie von JSON lautet "Keep it simple".
„Zitat - Name mit
"
“ ist viel einfacher , als „Sie Namen mit Zitat können"
oder'
aber Sie haben nicht zu, es sei denn , sie bestimmte Zeichen (oder Kombinationen von Zeichen , die es ein Schlüsselwort machen würde) und'
oder"
müssen quotiert werden je auf welchem Trennzeichen Sie ausgewählt haben " .Nein. In JavaScript sind sie identisch.
quelle
JSON.parse
Funktion: FunktioniertJSON.parse('{"a":1}')
gut , warumJSON.parse('{a:1}')
wird eine Ausnahme ausgelöst .JSON.parse
ist ein in JavaScript implementierter JSON-Parser, kein JavaScript-Parser.Ich hinterlasse ein Zitat aus einer Präsentation, die Douglas Crockford (der Schöpfer des JSON-Standards) Yahoo gegeben hat.
Er spricht darüber, wie er JSON entdeckt hat und warum er sich unter anderem für die Verwendung von Anführungszeichen entschieden hat :
Das vollständige Video und Transkript finden Sie hier .
quelle
{ a }
Eigenschaft 'a' den Wert einer globalen oder lokalen Variablen 'a' kopiert.{[key]: value}
Sowohl
:
als auch Leerzeichen sind in Bezeichnern zulässig. Ohne die Anführungszeichen würde dies zu Mehrdeutigkeiten führen, wenn versucht wird, festzustellen, was genau den Bezeichner ausmacht.quelle
In Javascript können Objekte wie ein Hash / eine Hashtabelle mit Schlüsselpaaren verwendet werden.
Wenn Ihr Schlüssel jedoch Zeichen enthält, die Javascript nicht als Namen kennzeichnen konnte, schlägt dies fehl, wenn versucht wird, wie eine Eigenschaft auf ein Objekt und nicht auf einen Schlüssel zuzugreifen.
Bezeichner können manchmal Zeichen enthalten, die in Javascript nicht als Token / Bezeichner ausgewertet werden können. Daher ist es am besten, alle Bezeichner aus Gründen der Konsistenz in Zeichenfolgen zu setzen.
quelle
Ich denke, die richtige Antwort auf Cheesos Frage ist, dass die Implementierung die Dokumentation übertroffen hat. Es wird keine Zeichenfolge mehr als Schlüssel benötigt, sondern etwas anderes, das entweder eine Zeichenfolge (dh in Anführungszeichen) oder (wahrscheinlich) alles sein kann, was als Variablenname verwendet werden kann. Ich denke, dies bedeutet, dass Sie mit einem Buchstaben beginnen, _ , oder $, und enthalten nur Buchstaben, Zahlen sowie $ und _.
Ich wollte den Rest für die nächste Person vereinfachen, die diese Frage mit der gleichen Idee wie ich besucht. Hier ist das Fleisch:
Variablennamen werden in JSON nicht interpoliert, wenn sie als Objektschlüssel verwendet werden (Danke Friedo!)
Breton, der "Bezeichner" anstelle von "Schlüssel" verwendete, schrieb: "Wenn ein Bezeichner zufällig ein reserviertes Wort ist, wird er als dieses Wort und nicht als Bezeichner interpretiert." Das mag wahr sein, aber ich habe es ohne Probleme versucht:
=> 6
Über die Verwendung von Anführungszeichen schrieb Quentin: "... aber das müssen Sie nicht, es sei denn, [der Schlüssel] enthält bestimmte Zeichen (oder Kombinationen von Zeichen, die es zu einem Schlüsselwort machen würden)."
Ich fand, dass der vorherige Teil (bestimmte Zeichen) mit dem @ -Zeichen wahr ist (tatsächlich denke ich, dass $ und _ die einzigen Zeichen sind, die den Fehler nicht verursachen):
=> Syntaxfehler
=> 1
Aber die Klammer über Schlüsselwörter, wie ich oben gezeigt habe, ist nicht wahr.
Was ich wollte, funktioniert, weil der Text zwischen der Öffnung {und dem Doppelpunkt oder zwischen dem Komma und dem Doppelpunkt für nachfolgende Eigenschaften als nicht zitierte Zeichenfolge verwendet wird, um einen Objektschlüssel zu erstellen, oder, wie Friedo es ausdrückte, als Variablenname dort nicht. ' t interpoliert werden:
=> ABC123
quelle
Wenn json Objekte beschreibt, erhalten Sie in der Praxis Folgendes
also dann,
Selbst wenn Ihre Beispiele das gleiche Ergebnis liefern, würden ihre Entsprechungen im "Rohcode" dies nicht tun. Vielleicht deswegen?? Keine Ahnung, nur eine Idee.
quelle
{ bar: 'goodbye' }
setzt den Schlüsselnamen nicht auf den Wert vonbar
, sondern nurbar
. Die anderen haben Recht mit dem Grund, warum für die Spezifikation Anführungszeichen erforderlich sind: Sie soll Konflikte mit Schlüsselwörtern und Sonderzeichen vermeiden.Dies kann die Datengröße verringern, wenn Anführungszeichen für Namen nur bei Bedarf zulässig sind
quelle