您的位置:首页 > Web前端 > JQuery

eval()与jQuery.parseJSON()的差别以及常见的解析缺少分号的问题

2016-03-02 00:00 609 查看
摘要: eval()与jQuery.parseJSON()的差别以及常见的解析缺少分号的问题

在网络上,前台获取数据的方式主要为:xml,json,xml,jsonp,txt,其中最多的方式为json,服务器将json返回前台,前端工程师用javascript进行解析获取重要数据,

json传送数据,内容占空间较小,但是可读性较差。

最简单的json表达式为{'name':'jack'}跟java中的map类似,分为key,value.由于现在做的一个项目涉及到json的解析,这里我简单学习了一下json.

json的两种解析方式,一个是javascript自带api中的函数eval(),一个是jquery.parseJSON(),那么这两个方法有什么不同呢。

现在我们自定义一个简单的json模式对象:
 var result1={'name':'jack','age':'23','work':'IT'};

自定义一个简单的方法,方法名自定义:

function pjson(){  var str=eval(result1);  alert(str.name);  }

跟预想的一样,弹出一个框,内容显示为jack.由于给予的json比较规范,所以通过以下方式也可以直接获取数据,

function pjson1(){  alert(result1.name);}

返回值仍为jack.
关于jQuery.parseJson对json的解析方式,如果这里采用result1那么会报错,使得json无法被解析,如图json2所示



我们需要将json进行修改,如将单引号改为双引号:

。

var result2={"name":"jack","age":"23","work":"IT"};

然而还是会出错,错误信息如图:json3所示



最后将json再次修改为如下所示

var result2='{"name":"jack","age":"23","work":"IT"}';

终于解析成功。这里也就留给我们一个问题,到底用那种方式进行json解析最为靠谱,也就是可以适合所有的json数据解析。



这里如果还想采用pjson1方式获取数据已经不可能,因为整个result2已经被当作一个字符串。
那么我们如果用pjson()方式又是什么效果呢?试一下吧!

var result2='{"name":"jack","age":"23","work":"IT"}';  function pjson(){  var str=eval(result2);  alert(str.name);  }

其所报的错误为缺少分号:


这个结果让我很诧异。

在这里我依稀记得需要在eval()方法中加入括号,但是是什么括号忘记了。这里试一下,没办法,总的理解事情的真相:
先添加一对大括号{}:

var result2='{"name":"jack","age":"23","work":"IT"}';  function pjson(){  var str=eval("{"+result2+"}");  alert(str.name);  }

出现异常,如图json5.png所示。



添加一对[]括号:

var result2='{"name":"jack","age":"23","work":"IT"}';  function pjson(){  var str=eval("["+result2+"]");  alert(str.name);  }

出现无定义的声明:如图json6.png



很不情愿的添加一对小括号():

var result1={'name':'jack','age':'23','work':'IT'};  var result2='{"name":"jack","age":"23","work":"IT"}';  function pjson(){  var str=eval("("+result2+")");  alert(str.name);  }

居然成功了,返回结果与需要的结果完全一致。
当我们为自己的成功感到自豪时一个问题又出现了,能不能用pjson解析result1中的数据呢。
答案居然是否定的,我们做了这么多无非就是希望能够找到一个能够解析所有json的一种方式,而此时抛出的异常居然是缺少‘]’。



那我们该如何解决呢,肯定是有办法的,最后我认为给予result赋值时获取的事一个对象,该类型不是字符串,毕竟在json1方法中能够调用就证明了这点,result1的定义方式
倒有点类似枚举之类的。
最后我将result改为这样

var result1="{'name':'jack','age':'23','work':'IT'}";  function pjson2(){  var str=jQuery.parseJSON(result1);  alert(str.name);  }

出现错误,如图:


这个错误我很少见到,个人认为所说的无效字符是指我的json格式不能被解析吧,可能jQuery.parseJSON()不能解析带单引号的json数据,
查看了一下API貌似也是这样说的,(英语水平有限,大意纯属猜测)。
仿照eval()的方式添加各种括号都没有成功,也从侧面证明着我的猜测。当服务器返回数据时我们很难把握它的格式,但是只要说json我们应该采用eval()方法去处理,
当然这里只是我根据小量信息做出的结论。

其实我们从服务器获取的数据保装一般如:{'name':'jack','age':'23','work':'IT'}但是跟上面我们自定义的result1不一样,
由于其本身为字符串形式,所以我们采用的方法不会出错,而result1输出返回的是一个object对象。只有给其添加“”号成为字符串才能被解析。
以下两种方式也都能成功:

var result1="{name:'jack',age:'23',work:'IT'}";  var result2='{name:"jack",age:"23",work:"IT"}';  function pjson(){  str=eval("("+result2+")");  alert(str.name);  }

其实现在有点迷惑,jquery.parseJSON()功能应该不会比eval()差,为什么在这里却出现上述问题呢?也许对jQuery.parseJSON而言,result1不符合标准。
将result1放到json解析器中查看爆出:json9.png这样的异常。
查阅很多资料上面的json格式key和value对象或字符串都是采用双引号"",也就是说var result2='{"name":"jack","age":"23","work":"IT"}';
才是标准的json.

这里必须说明一下,个人还是推荐使用eval("("+data+")"),从我的从业生涯中遇到的json里面的数据都是单引号,也就是说jQuery.parseJSON根本无法解析。
最后祝各位工作顺利。








内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ajax