我需要将JavaScript对象序列化并反序列化以将其存储在数据库中。
请注意,这些对象包含函数,因此我无法将它们存储为JSON,所以我不能使用json2.js。
在JavaScript中,[反]序列化JavaScript对象的最新技术是什么?
我需要将JavaScript对象序列化并反序列化以将其存储在数据库中。
请注意,这些对象包含函数,因此我无法将它们存储为JSON,所以我不能使用json2.js。
在JavaScript中,[反]序列化JavaScript对象的最新技术是什么?
一般来说,(在浏览器中)没有办法将带有函数的对象序列化:每个函数都有一个对其外部作用域的引用,而当您对其进行反序列化时,该作用域将不存在,因此对该作用域的序列化引用将无效。
我会使用内置的(或json2.js)JSON.stringify
和JSON.parse
函数与replacer
和reviver
参数。下面是示例代码:
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(latitude,longitude)" 格式只是其中一种方式。你甚至可以返回一个 JavaScript 对象,可以本地序列化为 JSON。LatLng
构造函数会为您添加回函数。替换器可以用于函数,所以如果您真的想要,可以尝试将函数转换为字符串。但请注意,它并不适用于每种情况。 - Matthew Crumley您不希望序列化诸如函数之类的逻辑。
如果您将来必须更新逻辑/ js函数,您不(总是)希望较旧的逻辑随数据重新加载。请注意。
使用 gserializer:
http://www.onegeek.com.au/articles/programming/javascript-serialization.php
代码在 Google 上:
http://code.google.com/p/gserializer/
GSerializer 是一个 JavaScript 库,用于将 JavaScript 对象序列化/反序列化为字符串,以便在 Cookie 中持久化。与许多其他实现不同,GSerializer 还可以序列化函数和非 JSON 符号。
var JASON = require("JASON");
str = JASON.stringify(obj);
obj = JASON.parse(str);
通过以下方式安装软件包:npm install JASON
。
npm install jsoff
或yarn 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
出于安全原因,我不会序列化JS函数。通过公共API,各种恶意内容都可能被发送到数据库中。至于反序列化,我有一种不同的方法。我将客户端定义的模型对象与来自JSON的数据混合在一起。我有一个小工具可以做到这一点,在GitHub上查看khayll/jsonmix。
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());