将JSON转换为X类型的JavaScript对象

时间:2014-09-29 08:09:04

标签: javascript json node.js

我知道所有关于JSON.stringify或JSON.parse的意思是,一个序列化一个对象,一个将字符串反序列化回一个对象。这很棒!

但是,我有以下情况:

var i = new MyMagicalObject();
var oi = JSON.parse(JSON.stringify(i));
console.log(i.numFields()); // this is fine
console.log(oi.numFields()); // this throws since Object has no method 'numFields'

基本上,我希望将oi视为" MyMagicalObject"因为它是什么。

我确信在oi或其他东西上设置原型有一些神奇之处,但我对JavaScript来说还是个新手。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

你不能存储" JSON字符串中的JavaScript函数。

可以存储在JSON中的唯一数据类型是:

  
      
  •   
  • 字符串
  •   
  • 布尔
  •   
  • 阵列
  •   
  • 对象
  •   
  •   

(source)

任何不属于这些类型的东西都会被忽略:



function Test(){
    this.foo = function(){
        return 'bar';
    }
    this.theAnswer = '42';
}
var t = new Test();
alert(t.foo());
alert(JSON.stringify(t))




答案 1 :(得分:1)

您可以创建一个新的MyMagicalObject(),然后使用oi中的属性覆盖其属性。

var t = new MyMagicalObject();
for(var k in oi) t[k]=oi[k];

这应该可以解决问题。如果您有一个更复杂的对象(具有多个维度),请搜索深度复制所有属性的复制函数。

答案 2 :(得分:1)

重新设计MyMagicalObject课程可以轻松解决您的问题。以下是JSON友好类的示例:

function MyMagicalObject(props) {
  this.props = props || {};
}

MyMagicalObject.prototype.get = function(key) {
  return this.props[key];
};

MyMagicalObject.prototype.set = function(key, val) {
  this.props[key] = val;
  return this;
};

MyMagicalObject.prototype.toJSON = function() {
  return this.props;
};

MyMagicalObject.prototype.numFields = function() {
  return Object.keys(this.props).length;
};

这种认识遵循两条规则:

  1. 它的构造函数接受JSON表示作为第一个参数。
  2. 它提供了toJSON方法来告诉JS引擎如何将其实例转换为JSON。
  3. 检查以下示例:

    var obj = new MyMagicalObject();
    obj.set('foo', 42).set('bar', 'baz');
    alert(obj.numFields()); // 2
    
    var str = JSON.stringify(obj);
    
    var obj2 = new MyMagicalObject(JSON.parse(str));
    alert(obj2.numFields()); // 2
    

答案 3 :(得分:0)

在第3行之后添加oi.prototype = MyMagicalObject.prototype;

创建一个新对象并复制属性:

var oi2 = new MyMagicalObject();
for (var p in oi) {
    if (oi.hasOwnProperty(p)) {
        oi2[p] = oi[p]
    }
}
console.log(oi2.numFields());