我正在尝试使用以下内容将JSON对象转换为“普通”对象...
var slaobj = eval('('+s+')');
是JSON
。然而,它似乎没有工作(它的`.length'回来是未定义的)。我做错了什么?
答案 0 :(得分:3)
这是`。length'以未定义的方式回归
它不一定具有length
属性,除非它是一个数组或其他具有一个的对象。例如:
var json = '{"foo": "Value of foo"}';
var obj = eval('(' + json + ')');
alert(obj.foo); // alerts "value of foo"
alert(obj.length); // alerts "undefined", there's no `length` in `obj`
偏离主题:使用eval
反序列化JSON文本可能是一个安全问题,除非您可以毫不含糊地信任JSON文本的来源(例如,它是您自己的服务器和你通过SSL连接),因为eval
不解析JSON,它解析并运行JavaScript代码。 (添加括号并没有多大帮助。)你可以选择使用Douglas Crockford Github page的eval
(他是JSON的发明者)。最后我检查过,有三种选择,其中两种根本不使用eval
;有关详细信息,请参阅页面底部的自述文件。
答案 1 :(得分:1)
对象并非都具有“.length”属性。对象文字如:
{ 'foo': 100, 'bar': 'Abraham Lincoln' }
描述了一个没有“.length”属性的对象。
JavaScript 数组对象具有“。length”属性,因为语言运行时的工作方式。但是,如果你把它放在那里,JavaScript中的普通对象只有这样的属性。
答案 2 :(得分:0)
更新:啊,我知道,这就是括号的用途。大鼠。删除了第一部分。
但这仍然有效:
请勿使用eval!
eval()是一个危险的函数,它 执行它传递的代码 来电者的特权。如果你跑 eval()带有可能的字符串 受恶意方影响,您可以 最终运行恶意代码 具有权限的用户机器 您的网页/扩展程序。更多 重要的是,第三方代码可以看到 调用eval()的范围, 这可能导致可能的攻击 类似功能的方式 不容易受到影响。
答案 3 :(得分:0)
你是如何检索对象的?
我想说还有其他问题 - 你确定's'的JSON对象是否正确返回了? JSON.org
要将JSON文本转换为对象,可以使用eval()函数。 eval()调用JavaScript编译器。由于JSON是JavaScript的适当子集,因此编译器将正确解析文本并生成对象结构。文本必须包含在parens中,以避免绊倒JavaScript语法中的歧义。
var myObject = eval('(' + myJSONtext + ')');
答案 4 :(得分:0)
http://www.jsonlint.com/此网站具有良好的JSON字符串验证,您应始终随意使用。当JSON字符串非常大时,验证它是很好的。
也不要使用eval()来获取JSON对象。 Visit http://www.json.org/它有非常好的指南行检查它。
今天有许多JavaScript库提供JSON API。我建议您使用其中一个以确保安全。
http://api.jquery.com/jQuery.getJSON/