这个问题是在工作中碰到的,所以分享出来.公司使用的是jQuery作为前端开发框架.昨天在取后台传过来的数据时候,使用json格式取出的数据变成了字符串.
数据条数总共只有8条,然而使用alert(json.length)的时候,却弹出了2185条数据.所以遇到这样的情况,我们需要手动的把字符串转换为js对象,因为此时计算的长度是整个字符串的长度.
转换方法有3种:
- eval() 函数
- 使用 new Funtion()构造函数
- 使用浏览器内置JSON.parse方法(IE Version > IE8(S))
来说说使用的建议:
eval()函数,很强大的函数,会模拟出一个js解析器,能解析任何js代码,但是执行效率和安全性不是很好.所以在做Demo的时候可以使用,但是做项目的时候不推荐用它.
Function构造函数方法,这是Jquery中解析JSON数据的方法,查看他的源代码(580行)中即可看到,使用此方法,经人测试,速度确实比eval()快很多倍.
/** *jQuery源码,557-580行 */ ... ... parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return (new Function( "return " + data ))(); } jQuery.error( "Invalid JSON: " + data ); } ... ...
JSON.parse()这是后来添加到浏览器内置解析JSON数据的方法,所以存在浏览器兼容性问题,但是因为是内置方法,肯定速度上是超快的,所以应该是最佳选择吧,至于解决浏览器兼容问题,可以针对IE6-IE8使用(Function())()方法解决,即可.
三种方法使用代码:
var json = '{"name":"liangqi","sex":"boy"}'; //eval() jsonObj0 = eval('('+json+')'); //Function 创建一个闭包,返回一个json数据对象 jsonObj1 = (new Function('return'+json))(); //JSON.parse() if(window.JOSN){ jsonObj2 = JSON.parse(json); }else{ ... ... //针对比支持此方法的调用此处 }