如何使用JSON重新构建Javascript对象?

时间:2009-10-19 15:29:01

标签: javascript json

我有一个这样的对象:

var someObj = Class.create ({
  initialize: function(objName){
      this.objName = objName;
  }
});

我可以用

o = new someObj("objName");

做一个obj。我可以使用Object.toJSON(o)将o更改为JSON字符串, 但我希望JSON String转换回someObj,所以,我使用eval()来传递 JSON String成为一个对象,但问题是,它可以成为一个JS Obj, 但是“o”的构造函数不是someObj。如何通过使用来评估JSON字符串 “someObj”作为构造函数?

3 个答案:

答案 0 :(得分:5)

JSON字符串不能表示具有成员函数的对象,因此您将从JSON字符串中获取的唯一内容是原始数据。假设toJSON方法导致JSON字符串表示具有类实例的所有非函数成员的对象,您应该能够获取结果对象并附加原型以获取所有函数。例如,使用jQuery方便的extend函数:

var o = new someObj("objName");
var json = Object.toJSON(o);
var json_obj = eval(json);
$.extend(json_obj, someObj.prototype);
json_obj.someMethodDefinedOnsomeObj()

根据您用来表示JavaScript中的类的框架如何使用原型对象模型,您的milage可能与上面的示例非常相似。此外,使用eval()会创建一个安全漏洞,因此如果您不信任JSON字符串的来源,则应使用不同的反序列化方法。仅供全面报道,以下是我使用原始原型的方法:

function Animal(name){
    this.name = name;
}
Animal.prototype.talk = function(){
    console.log("My name is "+this.name);
}

var a = new Animal("Brendan Eich");
a.talk();

var json = '{name: "Tim Berners-Lee"}'
var b = eval(b);
$.extend(b, Animal.prototype);
b.talk();

在firebug控制台中,这会产生输出:

  

我叫Brendan Eich

     

我的名字是Tim Berners-Lee

答案 1 :(得分:2)

请参阅http://json.org/js.html

处的JSON启动
 var myObject = JSON.parse(myJSONtext, reviver);
  

可选的reviver参数是a   将为每个人调用的函数   每个级别的关键和价值   最后结果。每个值都是   取而代之的是复活的结果   功能。这可以用来改革   将通用对象转换为实例   伪类,或转换日期   字符串到Date对象。

答案 2 :(得分:0)

你正在使用prototypejs吗?我总是发现这很棘手,最后只是创建了我自己的初始化程序,读取了eval ed或json字符串本身的对象。