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
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.
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.
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.
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
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
.
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());