【发布时间】:2012-12-25 02:17:30
【问题描述】:
使用 eval 或 JSON.parse 将 JSON 加载到 javascript 中的对象中很容易。
但是如果你有一个适当的“类”类函数,你如何将 JSON 数据导入其中?
例如
function Person(name) {
this.name=name;
this.address = new Array();
this.friendList;
this.promote = function(){
// do some complex stuff
}
this.addAddress = function(address) {
this.address.push(address)
}
}
var aPersonJSON = '{\"name\":\"Bob\",\"address\":[{\"street\":\"good st\",\"postcode\":\"ADSF\"}]}'
var aPerson = eval( "(" + aPersonJSON + ")" ); // or JSON.parse
//alert (aPerson.name); // Bob
var someAddress = {street:"bad st",postcode:"HELL"};
//alert (someAddress.street); // bad st
aPerson.addAddress(someAddress); // fail!
关键是我需要能够从 JSON 创建适当的 Person 实例,但我能得到的只是一个愚蠢的对象。我想知道它是否可以用原型做一些事情?
我不想解析 JSON 的每一行并将每个变量分配给对应的函数属性,这太难了。我实际拥有的 JSON 和函数比上面的例子复杂得多。
我假设可以将函数方法 JSONify 到 JSON 字符串中,但是由于我需要使结果数据尽可能小,这不是一种选择 - 我只想存储和加载数据,而不是 javascript 代码对于方法。
如果我可以帮助它(但可能是唯一的方法),我也不想将 JSON 加载的数据作为子对象,例如
function Person(name) {
this.data = {};
this.data.name=name;
}
var newPerson = new Person("");
newPerson.data = eval( "(" + aPersonJSON + ")" );
alert (newPerson.data.name); // Bob
有什么想法吗?
【问题讨论】:
-
请使用
JSON.parse而不是eval来解析JSON。如果目标浏览器不支持JSON.parse(即 IE7 或更早版本),则可以通过 Crockford 的json.js(在内部使用eval,但也提供完整性验证)或json2.js的 shim 随时可用。 -
嗨,问题不是 eval 或 parse,它们都产生相同的无类型对象,我正在尝试找到一种方法将 JSON 放入 Person 函数中。对此有何想法?
-
@JohnLittle 从不使用 eval!,它是许多安全问题的根源(代码注入等)read this
-
@thepoosh 这就是为什么它是一个评论 :) 在任何情况下,JSON 都不是“与特定类型的对象相关联”。两种方法是添加单例方法或使用适当的构造函数/[[prototype]] 将 JSON 中的值(可能是深度复制)复制到新对象。
-
你不能只迭代对象并替换 .prototype 和构造函数吗?
标签: javascript json