Comment sérialiser et deserialiser des objets Javascript?

je dois sérialiser et desérialiser les objets Javascript pour les stocker dans un DB.

notez que ces objets contiennent des fonctions, donc je ne peux pas les stocker en tant que JSON, donc je ne peux pas utiliser json2.js.

Quel est l'état de l'art dans la [de]sérialisation des objets javascript (en javascript bien sûr).

Merci, Stewart

30
demandé sur Stewart Johnson 2010-08-31 15:30:00

6 réponses

en général, il n'y a aucun moyen (dans un navigateur) donc de sérialiser les objets avec des fonctions attachées à eux, puisque chaque fonction a une référence à sa portée extérieure. Si la fonction renvoie à l'une de ces variables, elles n'existeront plus lorsque vous la désérialiserez.

ce que je voudrais c'est utiliser le intégré (ou json2.js) JSON.stringify et JSON.parse fonctions replacer et reviver paramètres. Voici un exemple partiel de la façon dont cela fonctionnerait:

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;
    }
});

Vous pouvez utiliser n'importe quel le format de sérialisation que vous voulez dans vos types personnalisés. Le format" LatLng(latitude,longitude) " n'est qu'une façon de le faire. Vous pouvez même retourner un objet javascript qui peut être sérialisé à JSON nativement.

26
répondu Matthew Crumley 2010-08-31 13:21:49

Vous ne voulez pas sérialiser logique comme des fonctions.

si vous devez mettre à jour vos fonctions logic / js dans le futur, vous ne voulez pas (toujours) que l'ancienne logique soit chargée avec les données nécessaires. Méfier.

10
répondu lknox 2013-09-27 18:21:31

utiliser gserializer:

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

le code dans google :

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

GSerializer est une bibliothèque javascript pour sérialiser/désérialiser javascript objets vers et à partir de chaînes de caractères, pour persistance dans say, un Cookie. Contrairement de nombreuses autres implémentations, GSerializer peut aussi sérialiser fonctions et notation non JSON.

7
répondu Haim Evgi 2010-08-31 11:33:56

si vous utilisez des versions ES6 de Node, vous pouvez vérifier un petit paquet que j'ai écrit appelé JSOFF. C'est le Format objet-fonction JavaScript; un remplacement direct pour JSON qui gère les fonctions.

c'est super petit et simple, donc Babeljs ou Browserify peuvent être vos amis.

Installer via: npm install jsoff ou yarn add jsoff.

Voici l'exemple comment créer un objet avec les fonctions:

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
répondu Sir Robert 2017-08-14 16:37:32

Sur Le Nœud.js, il y a aussi le JASON package.

Voici l'exemple:

var JASON = require("JASON");

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

Installer le paquet par: npm install JASON.

1
répondu prototype 2017-08-14 16:43:41

Je ne sérialiserais pas les fonctions JS pour des raisons de sécurité. Grâce à une API publique toutes sortes de choses désagréables pourraient être envoyées à la base de données. Quant à la desérialisation, j'ai une approche différente. Je mélange des objets modèles définis côté client avec les données provenant de JSON. J'ai un petit outil pour le faire, prendre un coup d'oeil sur GitHub khayll / jsonmix.

JsonMix fournit une sorte de désérialisation de JSON dans les objets JavaScript complet avec fonction.

Il devrait ressembler à quelque chose:

//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
répondu fishgen 2017-08-14 16:40:51