Kann mir jemand sagen , was der Hauptunterschied zwischen einem JavaScript - Objekt definiert durch die Verwendung Objektliteral Notation und Objekt JSON ?
Laut einem JavaScript-Buch heißt es, dass dies ein Objekt ist, das mithilfe der Objektnotation definiert wurde :
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
Warum ist es in diesem Fall kein JSON-Objekt? Nur weil es nicht durch Anführungszeichen definiert wird?
javascript
json
object-notation
Bleistiftkuchen
quelle
quelle
Antworten:
Lassen Sie uns zunächst klären, was JSON tatsächlich ist. JSON ist ein textuelles , sprachunabhängiges Datenaustauschformat, ähnlich wie XML, CSV oder YAML.
Daten können auf viele Arten gespeichert werden. Wenn sie jedoch in einer Textdatei gespeichert und von einem Computer lesbar sein sollen, müssen sie einer bestimmten Struktur folgen. JSON ist eines der vielen Formate, die eine solche Struktur definieren.
Solche Formate sind normalerweise sprachunabhängig, dh sie können von Java, Python, JavaScript, PHP verarbeitet werden.
Im Gegensatz dazu ist JavaScript eine Programmiersprache. Natürlich bietet JavaScript auch eine Möglichkeit, Daten zu definieren / beschreiben, aber die Syntax ist sehr spezifisch für JavaScript.
Als Gegenbeispiel hat Python das Konzept von Tupeln , deren Syntax lautet
(x, y)
. JavaScript hat so etwas nicht.Betrachten wir die syntaktischen Unterschiede zwischen JSON- und JavaScript-Objektliteralen.
JSON hat die folgenden syntaktischen Einschränkungen:
"
).true
false
null
{"foo":"bar","foo":"baz"}
) führen zu undefinierten, implementierungsspezifischen Ergebnissen. Die JSON-Spezifikation definiert ihre Semantik nicht speziellIn JavaScript können Objektliterale haben
undefined
.Wenn Sie nur die Syntax betrachten , wissen Sie, dass Ihr Beispiel aus zwei Gründen nicht JSON ist:
Vor allem aber, um meine Erklärung von Anfang an zu wiederholen: Sie befinden sich in einem JavaScript-Kontext. Sie definieren ein JavaScript-Objekt. Falls vorhanden, kann ein "JSON-Objekt" nur in einer Zeichenfolge enthalten sein:
Das heißt, wenn Sie JavaScript-Quellcode schreiben und sich nicht mit einer Zeichenfolge befassen , haben Sie sich nicht mit JSON befasst. Möglicherweise haben Sie die Daten als JSON erhalten (z. B. über Ajax oder Lesen aus einer Datei), aber sobald Sie oder eine von Ihnen verwendete Bibliothek sie analysiert haben, ist sie nicht mehr JSON.
Nur weil Objektliterale und JSON ähnlich aussehen , bedeutet dies nicht, dass Sie sie austauschbar benennen können. Siehe auch Es gibt kein "JSON-Objekt" .
quelle
JSON hat eine viel eingeschränktere Syntax, einschließlich:
"
und nicht zitiert werden'
quelle
Es gibt wirklich kein "JSON-Objekt".
Die JSON-Spezifikation ist eine Syntax zum Codieren von Daten als Zeichenfolge. Was die Leute ein "JSON-Objekt" (in Javascript) nennen, ist eigentlich nur ein gewöhnliches Javascript-Objekt, das (wahrscheinlich) von einer gültigen JSON-Zeichenfolge de-serialisiert wurde und leicht als gültige JSON-Zeichenfolge neu serialisiert werden kann. Dies bedeutet im Allgemeinen, dass es nur Daten (und keine Funktionen) enthält. Dies bedeutet auch, dass es keine Daten gibt, da JSON keinen Datumstyp hat (wahrscheinlich das Schmerzlichste an JSON;)
Wenn Leute über ein "JSON-Objekt" sprechen, meinen sie fast immer Daten, die die "geschweiften Klammern" auf der obersten Ebene haben. Dies entspricht gut einem Javascript-Objekt. Die JSON-Spezifikation erfordert jedoch nicht, dass sich auf der obersten Ebene einer JSON-Zeichenfolge ein einzelnes Objekt mit geschweiften Klammern befindet. Es ist absolut gültig, dass JSON eine Liste auf der obersten Ebene oder sogar nur einen einzigen Wert hat. Während also jedes "JSON-Objekt" einem gültigen JSON entspricht, entsprechen nicht alle gültigen JSON-Zeichenfolgen dem, was wir als "JSON-Objekt" bezeichnen würden! (weil die Zeichenfolge eine Liste oder einen Atomwert darstellen könnte)
quelle
JSON-text = object / array
.Nach JSON in JavaScript ,
Mit anderen Worten, gültiger JSON ist auch eine gültige JavaScript-Objektliteralnotation, aber nicht unbedingt umgekehrt.
Zusätzlich zum Lesen der Dokumentation , wie von @Filix King vorgeschlagen, empfehle ich auch, mit dem JSONLint-Online-JSON-Validator herumzuspielen . So habe ich gelernt, dass die Schlüssel von JSON-Objekten Zeichenfolgen sein müssen.
quelle
🔫 JSON : Die fettfreie Alternative zu XML
JSON wurde von Menschen, die festgestellt haben, dass es die Erstellung verteilter Anwendungen und Dienste erheblich vereinfacht, weitgehend übernommen. Der offizielle Internet-Medientyp für JSON ist
application/json
RFC 4627
. JSON-Dateinamen verwenden die Erweiterung.json
.► JavaScript Object Notation (
JSON
) ist ein leichtes, textbasiertes, sprachunabhängiges Datenaustauschformat. JSON wurde verwendet, um Daten zwischen Anwendungen auszutauschen, die in einer beliebigen Programmiersprache geschrieben sind.JSON ist eine Teilmenge von JavaScript. Javascript wurde vom ECMAScript Programming Language Standard abgeleitet.
► ECMAScript
ECMAScript hat sich zu einer der weltweit am häufigsten verwendeten Allzweck-Programmiersprachen entwickelt. Es ist am besten als die in Webbrowsern eingebettete Sprache bekannt, wurde aber auch für Server- und eingebettete Anwendungen weit verbreitet. ECMAScript basiert auf mehreren Ursprungs-Technologien, von denen die bekannteste
JavaScript
(Netscape Communications) undJScript
(Microsoft Corporation) sind . Obwohl ECMA vor 1994 als "European Computer Manufacturers Association" bekannt war, wurde nach 1994, als die Organisation global wurde, die "Marke" "Ecma" aus historischen Gründen beibehalten.ECMAScript ist die Sprache, während JavaScript, JScript und sogar ActionScript aufgerufen werden
"Dialects"
.Informationen über den Browser und den Computer Ihrer Benutzer.
ECMAScript ist die Skriptsprache, die die Grundlage von JavaScript bildet. .
JavaScript
language resources
ECMA-262
Links
Initial Edition, June 1997
PDF.
2nd Edition, August 1998
PDF.
3rd Edition, December 1999
PDF.
5th Edition, December 2009
PDF.
5.1 Edition, June 2011
HTML.
6th Edition, June 2015
HTML.
7ᵗʰ Edition, June 2016
HTML.
8th edition, June 2017
HTML.
9th Edition, 2018
HTML.
HINWEIS « 4. Ausgabe von ECMAScript nicht veröffentlicht, da die Arbeit unvollständig war .
► Schlüsselwerte müssen in Anführungszeichen gesetzt werden. Für Schlüssel sind nur Zeichenfolgen zulässig. Wenn Sie einen anderen als String verwenden, wird dieser in String konvertiert. Es wird jedoch nicht empfohlen, andere Schlüssel als die von String zu verwenden. Überprüfen Sie ein Beispiel wie dieses -
{ 'key':'val' }
vorbeiRFC 4627 - jsonformatter
► JSON-Zeichenfolgen müssen mit "und nicht" in Anführungszeichen gesetzt werden. Eine Zeichenfolge ähnelt stark einer C- oder Java-Zeichenfolge. Zeichenfolgen sollten in doppelte Anführungszeichen gesetzt werden.
Objekt Eigenschaftenaccessoren ermöglicht den Zugriff auf die Eigenschaften eines Objekts durch die Punktnotation oder die Klammer - Notation.
► Sie haben einen begrenzten Wertebereich (zB keine Funktionen erlaubt). Ein Wert kann eine Zeichenfolge in doppelten Anführungszeichen, Zahl, Boolescher Wert, Null, Objekt oder Array sein. Diese Strukturen können verschachtelt werden.
►
JavaScript
ist die beliebteste Implementierung des ECMAScript-Standards. Die Hauptfunktionen von Javascript basieren auf dem ECMAScript-Standard, aber Javascript verfügt auch über andere zusätzliche Funktionen, die nicht in den ECMA-Spezifikationen / -Standards enthalten sind. Jeder Browser verfügt über einen JavaScript-Interpreter.JavaScript ist eine dynamisch typisierte Sprache. Das heißt, Sie müssen den Datentyp einer Variablen nicht angeben, wenn Sie sie deklarieren, und die Datentypen werden bei Bedarf während der Skriptausführung automatisch konvertiert.
Literals
::Object literals
RFC 7159
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.
ECMAScript unterstützt die prototypbasierte Vererbung. Jedem Konstruktor ist ein Prototyp zugeordnet, und jedem von diesem Konstruktor erstellten Objekt ist ein impliziter Verweis auf den Prototyp (als Prototyp des Objekts bezeichnet) zugeordnet, der seinem Konstruktor zugeordnet ist. Darüber hinaus kann ein Prototyp einen impliziten Verweis ungleich Null auf seinen Prototyp haben und so weiter; Dies wird als Prototypkette bezeichnet.
In einer klassenbasierten objektorientierten Sprache wird der Status im Allgemeinen von Instanzen übertragen, Methoden werden von Klassen übertragen, und die Vererbung erfolgt nur über Struktur und Verhalten. In ECMAScript werden der Status und die Methoden von Objekten übertragen, und Struktur, Verhalten und Status werden alle vererbt.
Ein Prototyp ist ein Objekt, mit dem die Vererbung von Struktur, Status und Verhalten in ECMAScript implementiert wird. Wenn ein Konstruktor ein Objekt erstellt, verweist dieses Objekt implizit auf den zugehörigen Prototyp des Konstruktors, um Eigenschaftsreferenzen aufzulösen. Auf den dem Konstruktor zugeordneten Prototyp kann durch den Programmausdruck constructor.prototype verwiesen werden, und Eigenschaften, die dem Prototyp eines Objekts hinzugefügt wurden, werden durch Vererbung von allen Objekten gemeinsam genutzt, die den Prototyp gemeinsam nutzen.
quelle
Für diejenigen, die immer noch der Meinung sind, dass RFC wichtiger ist als Blogs und meinungsbasierte Missverständnisse, versuchen wir, einige Punkte zu klären. Ich werde nicht alle korrekten Unterschiede wiederholen, die bereits in früheren Antworten erwähnt wurden. Hier versuche ich nur, einen Mehrwert zu schaffen, indem ich einen entscheidenden Teil rfc7159 zusammenfasse
Auszüge aus https://tools.ietf.org/html/rfc7159
Beispiele (ab Seite 12 von RFC)
Dies ist ein JSON-Objekt:
Das Image-Member ist ein Objekt, dessen Thumbnail-Member ein Objekt und dessen IDs-Member ein Array von Zahlen ist.
"Ja wirklich?"
quelle
Object
, es ist einString
. Vielen DankSoweit ich weiß, ist der Hauptunterschied die Flexibilität .
JSON ist eine Art Wrapper für "JavaScript Object Notation", der Benutzer dazu zwingt, strengere Regeln für die Definition der Objekte einzuhalten. Dazu werden die möglichen Möglichkeiten zur Objektdeklaration eingeschränkt, die von der JavaScript-Objektnotationsfunktion bereitgestellt werden.
Als Ergebnis haben wir einfachere und standardisiertere Objekte, die sich besser für den Datenaustausch zwischen Plattformen eignen.
Im Grunde genommen ist das newObject in meinem obigen Beispiel ein Objekt, das mithilfe der JavaScript-Objektnotation definiert wurde. Es ist jedoch kein 'gültiges' JSON-Objekt, da es nicht den Regeln entspricht, die JSON-Standards erfordern.
Dieser Link ist auch sehr hilfreich: http://msdn.microsoft.com/en-us/library/bb299886.aspx
quelle
Zuerst sollten Sie wissen, was JSON ist:
Es ist ein sprachunabhängiges Datenaustauschformat. Die Syntax von JSON wurde von der JavaScript Object Literal-Notation inspiriert, es gibt jedoch Unterschiede zwischen ihnen.
In JSON müssen beispielsweise alle Schlüssel in Anführungszeichen gesetzt werden, während dies in Objektliteralen nicht erforderlich ist:
// JSON: {"foo": "bar"}
// Objektliteral: var o = {foo: "bar"}; Die Anführungszeichen sind in JSON obligatorisch, da in JavaScript (genauer in ECMAScript 3rd Edition) die Verwendung reservierter Wörter als Eigenschaftsnamen nicht zulässig ist, z. B.:
var o = {if: "foo"}; // SyntaxError in ES3 Während die Verwendung eines Zeichenfolgenliteral als Eigenschaftsname (unter Angabe des Eigenschaftsnamens) keine Probleme verursacht:
var o = {"if": "foo"}; Aus Gründen der "Kompatibilität" (und vielleicht einer einfachen Bewertung?) Sind die Anführungszeichen obligatorisch.
Die Datentypen in JSON sind auch auf die folgenden Werte beschränkt:
Zeichenfolgenummer Objektarray Ein Literal wie folgt: true false null Die Grammatik von Zeichenfolgen ändert sich. Sie müssen durch doppelte Anführungszeichen begrenzt werden, während Sie in JavaScript einfache oder doppelte Anführungszeichen austauschbar verwenden können.
// Ungültiger JSON: {"foo": 'bar'} Die akzeptierte JSON-Grammatik von Zahlen ändert sich ebenfalls. In JavaScript können Sie hexadezimale Literale verwenden, z. B. 0xFF, oder (die berüchtigten) Oktalliterale, z. B. 010. In JSON können Sie verwenden nur Dezimalliterale.
// Ungültiger JSON: {"foo": 0xFF}
quelle
Javascript Object Literal vs JSON:
JSON
Syntax der Sprache, die für 'Javascript-Objektnotation' steht, leitet sich von der Literal-Syntax des Javascript-Objekts ab. Es wird als programmiersprachenunabhängiges Textdatenübertragungsformat verwendet.Beispiel:
JS-Objektnotation, die in JS verwendet wird, um Objekte im Code bequem zu erstellen:
Beispiel für JSON:
Hauptunterschiede:
Alle Objektschlüssel in JSON müssen Zeichenfolgen sein. In Javascript können Objektschlüssel Zeichenfolgen oder Zahlen sein
Alle Zeichenfolgen in JSON müssen in doppelte Anführungszeichen gesetzt werden. Während in Javascript sowohl einfache als auch doppelte Anführungszeichen zulässig sind. Auch ohne Anführungszeichen in der Javascript-Objektnotation werden die Objektschlüssel implizit in Zeichenfolgen umgewandelt.
In JSON kann eine Funktion nicht als Wert eines Objekts definiert werden (da dies Javascript-spezifisch ist). In Javascript ist dies völlig legal.
Javascript eingebautes
JSON
Objekt:JSON
Objekte können mithilfe des integriertenJSON
Objekts, das Javascript zur Laufzeit anbietet , problemlos in Javascript konvertiert werden und umgekehrt . Beispielsweise:quelle
Hier ist ein überraschender Unterschied: Sie können nicht
undefined
in json verwenden und alle Objektfelder mit undefinierten Werten verschwinden danachJSON.stringify
🙈🙉🙊
quelle