在用ztree.js做商品分类树状显示时遇到了JSON数据转换的问题,发现可以用eval做处理,在网上找资料学习了下:
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
语法:
eval(string): string 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句
返回值
通过计算 string 得到的值(如果有的话)。
说明
该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。
在解析JSON格式的数据时:如果服务器返回的是JSON字符串,需要将JSON字符串转换成JSON对象
var o={name:"张三", age:19}; //此处o是js对象 ,对象字面量 alert(o.name); //此时的str_json才是json类型的字符串 var str_json = '{"name":"张三", "age":19}'; //str_json是符合JSON规范的字符串 var oJSON = eval('('+str_json+')'); //使用eval()把JSON字符串转化成js对象oJSON alert(oJSON.name); //张三
为什么要 eval这里要添加 “("("+data+")");//”呢?
原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个
例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下
面两个执行结果是不同的:
alert(eval("{}"); // return undefined alert(eval("({})");// return object[Object]
字符串转换成json的三种方式:
第一种:eval方式解析
function strToJson(str){ var json = eval('(' + str + ')'); return json; }
第二种:new Function形式
function strToJson(str){ var json = (new Function("return " + str))(); return json; }
第三种:使用全局的JSON对象
function strToJson(str){ return JSON.parse(str); }
另外:使用JSON.parse需严格遵守JSON规范,如属性都需用引号引起来,如下
var str = '{name:"jack"}'; var obj = JSON.parse(str); // --> parse error
name没有用引号引起来,使用JSON.parse所有浏览器中均抛异常,解析失败。而前两种方式则没问题