105 Stimmen

Ist es zulässig, Funktionen in JSON-Ergebnissen zu definieren?

Ein Teil der JSON-Antwort einer Website enthielt Folgendes (... aus Gründen des Kontexts 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 "Zeit" zugreifen, einen anderen Wert zurückgeben.

4voto

Tatu Ulmanen Punkte 119424

JSON schließt Funktionen ausdrücklich aus, da es nicht als reines JavaScript-Datenformat gedacht ist. Datenstruktur sein soll (trotz des JS im Namen).

4voto

Alireza Punkte 92209

Eine kurze Antwort lautet NO ...

JSON ist ein Textformat, das völlig sprachunabhängig ist, aber die Konventionen, die Programmierern der C-Familie vertraut sind Sprachen vertraut sind, darunter C, C++, C#, Java, JavaScript, Perl, Python und viele andere. Diese Eigenschaften machen JSON zu einer idealen Sprache für den Datenaustausch Sprache.

Sehen Sie sich den Grund dafür an:

Wenn Daten zwischen einem Browser und einem Server ausgetauscht werden, können die Daten nur Text sein.

JSON ist Text, und wir können jedes JavaScript-Objekt in JSON umwandeln, und JSON an den Server senden.

Wir können auch jedes vom Server empfangene JSON in JavaScript umwandeln Objekte umwandeln.

Auf diese Weise können wir mit den Daten als JavaScript-Objekte arbeiten, ohne kompliziertes Parsing und Übersetzungen.

Aber warten ...

Es gibt immer noch Möglichkeiten, Ihre Funktion zu speichern, sie ist weit verbreitet nicht empfohlen aber dennoch möglich:

Wir sagten, Sie können eine string ... wie wäre es dann mit der Umwandlung Ihrer Funktion in eine Zeichenkette?

const data = {func: '()=>"a FUNC"'};

Dann können Sie die Daten mit JSON.stringify(data) und dann mit JSON.parse um sie zu analysieren (falls dieser Schritt erforderlich ist)...

Und eval um eine String-Funktion auszuführen (bevor Sie das tun, sollten Sie wissen, dass die Verwendung von eval weithin nicht empfohlen wird):

eval(data.func)(); //return "a FUNC"

0voto

Durch die Verwendung von NodeJS (commonJS Syntax) war ich in der Lage, diese Art von Funktionalität arbeiten zu bekommen, hatte ich ursprünglich nur eine JSON-Struktur in einigen externen JS-Datei, aber ich wollte, dass die Struktur mehr von einer Klasse zu sein, mit Methoden, die zur Laufzeit entschieden werden könnte.

Die Angabe von "Executor" in myJSON ist nicht erforderlich.

var myJSON = {
    "Hello": "World",
    "Executor": ""
}

module.exports = {
    init: () => { return { ...myJSON, "Executor": (first, last) => { return first + last } } }
}

-5voto

Funktionsausdrücke im JSON sind durchaus möglich, vergessen Sie nur nicht, sie in doppelte Anführungszeichen einzuschließen. Hier ist ein Beispiel aus dem Design einer noSQL-Datenbank:

{
  "_id": "_design/testdb",
  "views": {
    "byName": {
      "map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}"
    }
  }
}

-6voto

pascati Punkte 9

Obwohl eval nicht empfohlen wird, funktioniert dies:

<!DOCTYPE html>
<html>
<body>

<h2>Convert a string written in JSON format, into a JavaScript function.</h2>

<p id="demo"></p>

<script>
    function test(val){return val + " it's OK;}
    var someVar = "yup";
    var myObj = { "func": "test(someVar);" };
    document.getElementById("demo").innerHTML = eval(myObj.func);
</script>

</body>
</html>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X