javascript嵌套类型对象到json和后面

时间:2014-02-11 14:16:17

标签: javascript json serialization

为了序列化,我想知道是否有一个用于将类型化对象转换为普通json并返回的库。

天真的解决方案就像:

function Person( name, sex, age ) {
    this.name = name;
    this.sex = sex;
    this.age = age;
}

Person.prototype.serialize = function () {
    var obj = this;
    return '{ ' + Object.getOwnPropertyNames( this ).map( function ( key ) {
        var value = obj[key];
        if ( typeof value === 'string' ) { value = '"' + value + '"'; }
        return '"' + key + '": ' + value;
    }).join( ', ' ) + ' }';
};

Person.deserialize = function ( input ) {
    var obj = JSON.parse( input );
    return new Person( obj.name, obj.sex, obj.age );
};

(来自:Javascript Serialization of Typed Objects

是否有嵌套类型的简单解决方案?

编辑:

假设我有一组模型(如骨干模型): 用户,任务等 每个模型都支持toJson和fromJson函数。 toJson返回具有模型属性的普通对象。 fromJson获取一个普通对象并创建一个新的模型对象。

我正在寻找可以恢复类型的解决方案。例如,通过使用原始类型的名称保存“_prototype”属性。

编辑:

我刚发现:https://stackoverflow.com/a/14028886/1163440 这就是我的想法..但我正在寻找嵌套类型

1 个答案:

答案 0 :(得分:2)

您可以将JSON.stringify与 replacer 一起使用,将JSON.parse与 reviver 一起使用,如下所示:

function Person (name) {
    this.name = name;
}

var p = new Person('haaa');

p.children = [new Person('haaa jr')]

var str = JSON.stringify(p, function replacer (key, value) {
    //warning this change the object. maybe use $.extend or xtend, or a deep clone library
    value.__type = value.constructor.name
    return value;
});

var parsed = JSON.parse(str, function reviver (key, value) {
    if (value.__type === 'Person') {
      var p = new Person(value.name);
      Object.getOwnPropertyNames(value).forEach(function (k) {
        p[k] = value[k];
      });
      return p;
    }
    return value;
});

console.log('is children a Person?', parsed.children[0] instanceof Person);

序列化对象将如下所示:

{
  "name": "haaa",
  "children": [
    {
      "name": "haaa jr",
      "__type": "Person"
    }
  ],
  "__type": "Person"
}

Replacer和reviver是非常强大的扩展点。