我需要序列化和反序列化 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)”格式只是一种方法。您甚至可以返回一个可以原生序列化为 JSON 的 JavaScript 对象。
您不想序列化函数等逻辑。
如果您以后必须更新您的逻辑/js 函数,您(总是)不希望将旧的逻辑与数据一起加载回来。谨防。
使用gserializer:
http://www.onegeek.com.au/articles/programming/javascript-serialization.php
谷歌中的代码:
http://code.google.com/p/gserializer/
GSerializer 是一个 javascript 库,用于将 javascript 对象序列化/反序列化到字符串和从字符串中序列化,例如 Cookie 的持久性。与许多其他实现不同,GSerializer 还可以序列化函数和非 JSON 符号。
在 Node.js 上,还有JASON 包。
这是示例:
var JASON = require("JASON");
str = JASON.stringify(obj);
obj = JASON.parse(str);
通过以下方式安装软件包:npm install JASON
。
如果您使用的是 ES6 版本的 Node,您可以查看我编写的一个名为JSOFF 的小包。它是 JavaScript 对象函数格式;处理函数的 JSON 的替代品。
它非常小巧和简单,所以 Babeljs 或 Browserify 可能是你的朋友。
安装通过: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