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

标签 javascript json

我有一个这样的对象:

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

我可以用

o = new someObj("objName");

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

最佳答案

JSON 字符串不能表示具有成员函数的对象,因此您从 JSON 字符串中得到的唯一东西就是原始数据。假设 toJSON 方法生成一个 JSON 字符串,表示一个包含类实例的所有非函数成员的对象,您应该能够获取结果对象并附加原型(prototype)以取回所有函数。例如,使用 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 中表示类的框架如何使用原型(prototype)对象模型,您可能会对上面的示例产生很大的了解。此外,使用 eval() 会产生安全漏洞,因此如果您不信任 JSON 字符串的来源,则应使用不同的反序列化方法。只是为了全面覆盖,这里是我如何使用原始原型(prototype)进行的:

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 控制台中,这会产生输出:

My name is Brendan Eich

My name is Tim Berners-Lee

关于javascript - 如何使用 JSON 重新构建 Javascript 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1589373/

相关文章:

javascript - 解析 JSON 时 Google Cloud Dataflow Javascript UDF 错误

javascript - 禁用拖放

json - 如何在部署aws时在json文件中添加gitlab用户定义的变量?

javascript - 从 AngularJS 中的 JSON 数组获取值

javascript:警报在任何浏览器中都不起作用,为什么

javascript - WebAssembly 可以获取 javascript 回调吗?

javascript - 类型中缺少属性,但类型中需要属性

ios - 二元运算符 '==' 不能应用于类型 'Any?' 和 'String' Swift iOS 的操作数

ios - swift 5 : Non-terrible solutions for sharing of JSON Key-values for Codable Structs?

json - 如何在 React 中渲染 JSON