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

Ste*_*son 34 javascript serialization

我需要序列化和反序列化Javascript对象以将它们存储在DB中.

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

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

谢谢,斯图尔特

Mat*_*ley 28

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

我想要的是使用内置(或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;
    }
});
Run Code Online (Sandbox Code Playgroud)

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


小智 9

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

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


Hai*_*vgi 7

使用gserializer:

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

谷歌中的代码:

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

GSerializer是一个javascript库,用于序列化/反序列化javascript对象与字符串之间的连续性,例如Cookie.与许多其他实现不同,GSerializer还可以序列化函数和非JSON表示法.

  • 看起来它不起作用:Gserializer TODO说:"实现将参数传递给序列化函数(目前只支持无参数函数)",我必须序列化的对象包含带参数的函数(对LatLng对象的toUrlValue函数: http://code.google.com/apis/maps/documentation/javascript/reference.html#LatLng).不管怎么说,还是要谢谢你! (4认同)