如何序列化和反序列化 JavaScript 对象?

IT技术 javascript serialization deserialization
2021-03-09 20:02:24

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

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

JavaScript 对象的 [反] 序列化的最新技术是什么(当然是在 JavaScript 中)。

6个回答

通常,(在浏览器中)无法序列化带有附加函数的对象:每个函数都有对其外部作用域的引用,反序列化时该作用域将不存在,因此对该作用域的序列化引用将无效.

我会做的是使用内置(或 json2.js)JSON.stringifyJSON.parse带有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(latitude,longitude)”格式只是一种方法。您甚至可以返回一个可以原生序列化为 JSON 的 JavaScript 对象。

有趣的。我阅读了 json2.js 文档(“在 JSON 中没有表示的值(例如函数和未定义)被排除在外。”)并假设函数没有调用替换器/恢复器函数。这段代码是您实际编写和使用的吗?
2021-04-21 20:02:24
不处理字符串中的某些字符,如换行符。
2021-04-25 20:02:24
@斯图尔特:这个想法是,当你反序列化它们时,你不必通过重新构造对象来避免序列化函数。LatLng构造函数将添加功能回到你。替换器将在函数上工作,所以如果你真的想要,你可以尝试将函数转换为字符串。请注意,它不会在所有情况下都有效。
2021-05-08 20:02:24

您不想序列化函数等逻辑。

如果您以后必须更新您的逻辑/js 函数,您(总是)不希望将旧的逻辑与数据一起加载回来。谨防。

使用gserializer

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

谷歌中的代码:

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

GSerializer 是一个 javascript 库,用于将 javascript 对象序列化/反序列化到字符串和从字符串中序列化,例如 Cookie 的持久性。与许多其他实现不同,GSerializer 还可以序列化函数和非 JSON 符号。

我早些时候遇到过,但我不确定该项目的成熟度。你个人用过吗?
2021-04-25 20:02:24
看起来它不起作用:Gserializer TODO 说:“实现将参数传递到序列化函数(目前仅支持无参数函数)”,并且我必须序列化的对象包含带参数的函数(LatLng 对象上的 toUrlValue 函数:code.google.com/apis/maps/documentation/javascript/...)。不管怎么说,还是要谢谢你!
2021-05-02 20:02:24
他已经一年没有碰过这个项目了。太糟糕了。我还需要带参数的函数
2021-05-05 20:02:24
抱歉 2,我希望他们完成这个项目
2021-05-06 20:02:24

在 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 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