【问题标题】:javascript nested typed object to json and backjavascript嵌套类型对象到json并返回
【发布时间】:2014-02-11 14:16:17
【问题描述】:

出于序列化目的,我想知道是否有一个库可以将类型化对象转换为纯 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 这就是我的想法..但我正在寻找嵌套类型

【问题讨论】:

  • JSON.stringify 有什么问题?
  • 我会澄清我的问题。谢谢

标签: javascript json serialization


【解决方案1】:

您可以将 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 是非常强大的扩展点。

【讨论】:

  • 不知道replacer/reviver。谢谢!
  • 一个问题:在 JSON.stringify 部分,我不应该只为非原始类型添​​加一个 __type 属性吗?
  • 有道理.. 在 Date 的情况下,我不确定如何处理,我知道还有另一个 json 库(可能是 json3)也能够序列化 Dates
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多