代码之家  ›  专栏  ›  技术社区  ›  Stewart Johnson

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

  •  32
  • Stewart Johnson  · 技术社区  · 14 年前

    注意,这些对象包含函数,所以我不能将它们存储为JSON,所以我不能使用json2.js。

    6 回复  |  直到 4 年前
        1
  •  30
  •   Matthew Crumley    14 年前

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

    我想使用的是内置的(或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;
        }
    });
    

        2
  •  9
  •   lknox    11 年前

    你不想序列化逻辑,比如函数。

    如果将来必须更新logic/js函数,则不一定(总是)希望旧的逻辑加载回数据。当心。

        3
  •  7
  •   Haim Evgi    14 年前

    使用 G串行化器

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

    谷歌的代码:

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

    序列化/反序列化javascript 与字符串之间的对象,例如 坚持,比如说,一块饼干。不像 许多其他实现, GSerializer还可以序列化

        4
  •  2
  •   kenorb    7 年前

    在节点.js,还有 JASON package

    var JASON = require("JASON");
    
    str = JASON.stringify(obj);
    obj = JASON.parse(str);
    

    通过以下方式安装程序包: npm install JASON

        5
  •  1
  •   kenorb    7 年前

    如果您使用的是Node的ES6版本,那么可以查看我编写的一个名为 JSOFF . 它是JavaScript对象函数格式;是处理函数的JSON的替代品。

    安装方式: 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
    
        6
  •  0
  •   kenorb    7 年前

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

    看起来像是:

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