如何序列化&反序列化Javascript对象?

时间:2010-08-31 11:30:00

标签: javascript serialization

我需要序列化和反序列化Javascript对象以将它们存储在数据库中。

请注意,这些对象包含函数,因此我无法将它们存储为JSON,因此我无法使用json2.js。

javascript对象的[de]序列化的最新技术(当然是在javascript中)。

谢谢, 斯图尔特

6 个答案:

答案 0 :(得分:27)

一般情况下,没有办法(在浏览器中)序列化附加了函数的对象,因为每个函数都引用了它的外部作用域。如果函数引用任何这些变量,则在反序列化时它们将不再存在。

我想要的是使用带有JSON.stringifyJSON.parse参数的内置(或json2.js)replacerreviver函数。以下是它如何工作的部分示例:

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

您可以在自定义类型中使用所需的任何序列化格式。 “LatLng(纬度,经度)”格式只是其中一种方式。你甚至可以返回一个可以本地序列化为JSON的javascript对象。

答案 1 :(得分:10)

您不希望序列化函数等逻辑。

如果将来必须更新逻辑/ js函数,则不(始终)希望旧逻辑必须用数据加载回来。当心。

答案 2 :(得分:7)

使用 gserializer

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

google中的代码:

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

  

GSerializer是一个javascript库   序列化/反序列化javascript   对象和来自字符串的对象   坚持说,一个Cookie。不像   许多其他实施,   GSerializer也可以序列化   函数和非JSON表示法。

答案 3 :(得分:1)

在Node.js上,还有JASON package

以下是示例:

var JASON = require("JASON");

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

按以下方式安装包:npm install JASON

答案 4 :(得分:1)

如果你正在使用ES6版本的Node,你可以查看我写的一个名为JSOFF的小包。它是JavaScript对象函数格式;用于处理函数的JSON的替代品。

它非常小巧简单,所以Babeljs或Browserify可能是你的朋友。

通过以下方式安装:npm install jsoffyarn add jsoff

以下是如何使用函数创建对象的示例:

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

答案 5 :(得分:0)

出于安全原因,我不会将JS函数序列化。通过公共API,可以将各种令人讨厌的东西发送到数据库。至于反序列化,我有不同的方法。我将客户端定义的模型对象与来自JSON的数据混合在一起。我有一个小工具,请在khayll/jsonmix的GitHub上查看。

  

JsonMix提供了一种从JSON到带有函数的JavaScript对象的反序列化。

看起来像是:

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