Ein Teil der JSON-Antwort einer Website hatte Folgendes (... für den Kontext hinzugefügt):
{..., now:function(){return(new Date).getTime()}, ...}
Ist das Hinzufügen anonymer Funktionen zu JSON gültig? Ich würde erwarten, dass jedes Mal, wenn Sie auf 'time' zugreifen, ein anderer Wert zurückgegeben wird.
json
anonymous-function
Zachary Scott
quelle
quelle
JSON.parse('{now:function(){return(new Date).getTime()}')
. Der Inspektor sagt:Uncaught SyntaxError: Unexpected token n
Ein kurzer Blick auf die JSON-Spezifikation bestätigt dies. Konzentrieren Sie sich auf den Abschnitt 'Wert'.Antworten:
Nein.
JSON ist lediglich als Datenbeschreibungssprache gedacht. Wie auf http://www.json.org erwähnt , handelt es sich um ein "leichtes Datenaustauschformat". - keine Programmiersprache.
Laut http://en.wikipedia.org/wiki/JSON werden folgende "Grundtypen" unterstützt:
null
quelle
a==null?1:a.toString()==""
Dies bedeutet, dass wenn a = null ist, 1 / true zurückgegeben wird. Wenn es "" bedeutet, was eine leere Zeichenfolge bedeutet, erhalten Sie auch 1 / true. Wenn dies der Fall ist nicht null oder "", dann wird 0 / false zurückgegeben. Sie können dies weiter replizieren, um mit [] zu arbeiten, und {} einfach?1:a==[]?1:a.toString()=={}.toString();
zu meinem vorherigen Snippet hinzufügen . Vielleicht hilft Ihnen diese Funktion.isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})
Ich würde?1:0
anstelle von?true:false
aber (wahr / falsch)Das Problem ist, dass JSON als Datendefinitionssprache aus JSON als JavaScript-Objektnotation hervorgegangen ist. Da Javascript die Auswertung von JSON unterstützt, ist es legitim, JSON-Code in JSON einzufügen (in diesem Anwendungsfall). Wenn Sie JSON verwenden, um Daten remote zu übergeben, ist es eine schlechte Praxis, Methoden in JSON einzufügen, da Sie Ihre Client-Server-Interaktion möglicherweise nicht gut modelliert haben. Wenn Sie JSON als Datenbeschreibungssprache verwenden möchten, würde ich sagen, dass Sie durch das Einbetten von Methoden in Schwierigkeiten geraten könnten, da einige JSON-Parser nur mit Blick auf die Datenbeschreibung geschrieben wurden und möglicherweise keine Methodendefinitionen in der Struktur unterstützen.
Der Wikipedia-JSON-Eintrag ist ein gutes Argument dafür, Methoden nicht in JSON aufzunehmen, und führt Sicherheitsbedenken an:
quelle
Lassen Sie uns eine der Spezifikationen zitieren - http://tools.ietf.org/html/rfc7159#section-12
In der JSON-Formatspezifikation (JavaScript Object Notation) wird Folgendes angegeben :
Alle Antworten, die besagen, dass Funktionen nicht Teil des JSON-Standards sind, sind also korrekt.
Die offizielle Antwort lautet: Nein, es ist nicht gültig, Funktionen in JSON-Ergebnissen zu definieren!
Die Antwort könnte ja sein, weil "Code ist Daten" und "Daten sind Code". Selbst wenn JSON als sprachunabhängiges Datenserialisierungsformat verwendet wird, funktioniert das Tunneln von "Code" durch andere Typen.
Eine JSON-Zeichenfolge kann verwendet werden, um eine JS-Funktion zur Ausführung an den clientseitigen Browser zu übergeben.
Dies führt zu Fragen wie: " Ausführen von als Zeichenfolge gespeichertem JavaScript-Code ".
Seien Sie darauf vorbereitet, das Flag "eval () ist böse" zu hissen und das Flag "Funktionen nicht durch JSON tunneln" daneben zu platzieren.
quelle
Soweit ich weiß, ist es nicht Standard. Ein kurzer Blick auf http://json.org/ bestätigt dies.
quelle
Nein, definitiv nicht.
Wenn Sie einen anständigen JSON-Serializer verwenden, können Sie eine solche Funktion nicht serialisieren. Es ist ein gültiges OBJEKT, aber kein gültiger JSON. Unabhängig von der Absicht dieser Website wird kein gültiger JSON gesendet.
quelle
JSON schließt Funktionen ausdrücklich aus, da es sich nicht um eine reine JavaScript-Datenstruktur handelt (trotz des JS im Namen).
quelle
Eine kurze Antwort lautet NEIN ...
Schauen Sie sich den Grund an, warum:
Aber warte ...
Es gibt immer noch Möglichkeiten, Ihre Funktion zu speichern. Dies wird allgemein nicht empfohlen , ist aber dennoch möglich:
Wir sagten, Sie können ein
string
... wie wäre es dann, wenn Sie Ihre Funktion in einen String konvertieren?Dann können Sie Daten mit
JSON.stringify(data)
und dann mitJSON.parse
analysieren, um sie zu analysieren (falls dieser Schritt erforderlich ist) ...Und eval , um eine Zeichenfolgenfunktion auszuführen (vorher müssen Sie nur wissen, dass eval weithin nicht empfohlen wird):
quelle
Durch die Verwendung von NodeJS (CommonJS-Syntax) konnte ich diese Art von Funktionalität zum Laufen bringen. Ursprünglich hatte ich nur eine JSON-Struktur in einer externen JS-Datei, aber ich wollte, dass diese Struktur eher eine Klasse ist, mit Methoden, über die entschieden werden kann Laufzeit.
Die Erklärung von 'Executor' in myJSON ist nicht erforderlich.
quelle
Funktionsausdrücke im JSON sind vollständig möglich. Vergessen Sie jedoch nicht, sie in doppelte Anführungszeichen zu setzen. Hier ist ein Beispiel aus dem Design der noSQL-Datenbank:
quelle
Obwohl eval nicht empfohlen wird, funktioniert dies:
quelle
Lassen Sie die Anführungszeichen weg ...
quelle