webentwicklung-frage-antwort-db.com.de

Wie werden Javascript-Objekte serialisiert und deserialisiert?

Ich muss Javascript-Objekte serialisieren und deserialisieren, um sie in einer Datenbank zu speichern. 

Beachten Sie, dass diese Objekte Funktionen enthalten, sodass ich sie nicht als JSON speichern kann und daher keine json2.js verwenden kann.

Was ist der Stand der Technik in der [de] Serialisierung von Javascript-Objekten (natürlich in Javascript).

Vielen Dank. Stewart

31
Stewart Johnson

Im Allgemeinen gibt es keine Möglichkeit (in einem Browser), Objekte mit damit verbundenen Funktionen zu serialisieren, da jede Funktion einen Verweis auf den äußeren Gültigkeitsbereich hat. Wenn die Funktion auf eine dieser Variablen verweist, gibt es sie nicht mehr, wenn Sie sie deserialisieren.

Ich würde die eingebauten (oder json2.js) JSON.stringify- und JSON.parse-Funktionen mit den Parametern replacer und reviver verwenden. Hier ist ein Teilbeispiel, wie es funktionieren würde:

JSON.stringify(yourObject, function(name, value) {
    if (value instanceof LatLng) { // Could also check the name if you want
        return 'LatLng(' + value.lat() + ',' + value.lng() + ')';
    }
    else if (...) {
        // Some other type that needs custom serialization
    }
    else {
        return value;
    }
});

JSON.parse(jsonString, function(name, value) {
    if (/^LatLng\(/.test(value)) { // Checking the name would be safer
        var match = /LatLng\(([^,]+),([^,]+)\)/.exec(value);
        return new LatLng(match[1], match[2]);
    }
    else if (...) {
        ...
    }
    else {
        return value;
    }
});

Sie können jedes gewünschte Serialisierungsformat für Ihre benutzerdefinierten Typen verwenden. Das Format "LatLng (Latitude, Longitude)" ist nur eine Möglichkeit, dies zu tun. Sie könnten sogar ein Javascript-Objekt zurückgeben, das nativ zu JSON serialisiert werden kann.

27
Matthew Crumley

Sie möchten keine Logik wie Funktionen serialisieren.

Wenn Sie Ihre logic/js-Funktionen in der Zukunft aktualisieren müssen, möchten Sie nicht (immer), dass die ältere Logik notwendigerweise mit den Daten zurückgeladen wird. In acht nehmen.

10
lknox

verwenden Sie gserializer:

http://www.onegeek.com.au/articles/programming/javascript-serialization.php

der Code in Google:

http://code.google.com/p/gserializer/

GSerializer ist eine Javascript-Bibliothek für Javascript serialisieren/deserialisieren Objekte zu und von Strings, für Beharrlichkeit in sagen wir, ein Cookie. Nicht wie viele andere Implementierungen, GSerializer kann auch .__ serialisieren. Funktionen und Nicht-JSON-Notation.

7
Haim Evgi

Auf Node.js gibt es auch das JASON-Paket .

Hier ist das Beispiel:

var JASON = require("JASON");

str = JASON.stringify(obj);
obj = JASON.parse(str);

Installieren Sie das Paket mit: npm install JASON.

1
prototype

Wenn Sie ES6-Versionen von Node verwenden, können Sie ein kleines Paket namens JSOFF auschecken. Es ist das JavaScript-Objekt-Funktionsformat. Ein Drop-In-Ersatz für JSON, der Funktionen behandelt.

Es ist winzig und einfach, so dass Babeljs oder Browserify Ihre Freunde sein könnten.

Installation über: npm install jsoff oder yarn add jsoff.

Hier ein Beispiel, wie Sie ein Objekt mit Funktionen erstellen:

const JSOFF  = require('jsoff');

var obj = {
  abc: 123,
  def: function (a,b) { return a * 2 + b * 3; },
  ghi: a => { return a * 2 },
  jkl: (a,b) => { return ((d,e) => { return a*d + b*e })(2,4) }
};

var str = JSOFF.stringify(obj);
// str is now:  
// '{"abc":123,"def":"function (a,b) { return a * 2 + b * 3; }","ghi":"a => { return a * 2 }","jkl":"(a,b) => { return ((d,e) => { return a*d + b*e })(2,4) }"}');
});

var clone = JSOFF.parse(str);
clone.def(10,5)   // 35
clone.ghi(5)      // 10
clone.jkl(10,20)  // 100
1
Sir Robert

Ich würde aus Sicherheitsgründen keine JS-Funktionen serialisieren. Über eine öffentliche API können alle möglichen bösen Dinge an die Datenbank gesendet werden. Bei der Deserialisierung habe ich einen anderen Ansatz. Ich mische auf Client-Seite definierte Modellobjekte mit den Daten von JSON. Ich habe ein kleines Werkzeug dafür, schau es auf GitHub unter khayll/jsonmix an.

JsonMix bietet eine Art Deserialisierung von JSON in JavaScript-Objekte mit Funktionen.

Es würde so aussehen:

//model definition (just an example)

var LatLng = function() {}
LatLng.prototype.getMapTypeId = function() {
   return this.mapTypeId;
}

//deserializing done like this
var result = JSMix(jsonString).withObject(LatLng.prototype, "latLngs").build();

//all items in the latLngs collection have the functions coming from the model
console.log(result.latLngs[5].getMapTypeId());
0
fishgen