论坛首页 入门技术论坛

新API解析JSON---Ajax之七

浏览 6050 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-08-16   最后修改:2010-08-18

ECMAScript 5发布有段时间了,其中就包括了解析JSON的原生API-JSON.parse。许多浏览器已经支持了。

主流js库如JQuery,Ext,Prototype都优先使用JSON.parse,不支持该方法的浏览器则使用new Function或eval。

为何优先使用JSON.parse,我想一个就是性能,原生的总是要快一些吧。此外JSON.parse较eval也更安全。

这里也当然不能落后了,优先使用JSON.parse,不行再用new Function方式。最后失败了会给failure的第二个参数msg赋值为"parse json error"

 

result = function(str){
	try{
		return JSON.parse(str);
	}catch(e){
		try{
			return (new Function('return ' + str))();
		}catch(e){
			failure(xhr,'parse json error',e);
		}
	}
}(xhr.responseText);
 

源码见附件

 

PS:字符串转换成json的三种方式

 

 

   发表时间:2010-08-18  
这篇是接着上一篇的帖子的吗,多总结一点东西出来,让我们这些新手多学点。
0 请登录后投票
   发表时间:2010-08-18  
不错,不错,又学到东西了,谢谢
0 请登录后投票
   发表时间:2010-08-19  
用try/catch性能会受影响,想要判断是否有JSON.parse方法,不如直接用if语句
if(JSON.parse){
  ...
} else {
  ...
}
0 请登录后投票
   发表时间:2010-08-19   最后修改:2010-08-19
magicbu 写道
用try/catch性能会受影响,想要判断是否有JSON.parse方法,不如直接用if语句
if(JSON.parse){
  ...
} else {
  ...
}

谢谢你的提醒。

曾经也纠结过用特性判断还是try catch。

既然语言本身提供了try catch,必要的时候还是可以用的,虽然某些大牛强调禁用trycatch,甚至写进了“开发规范”。

这里考虑更大的兼容性,比如"{age:28}"用JSON.parse不能成功解析会报异常,这样就跳到了catch中,catch使用new Function解析,可以解析成功。当然如果age加上引号是没问题的。
0 请登录后投票
   发表时间:2010-08-19   最后修改:2010-08-19
zhouyrt 写道
magicbu 写道
用try/catch性能会受影响,想要判断是否有JSON.parse方法,不如直接用if语句
if(JSON.parse){
  ...
} else {
  ...
}

谢谢你的提醒。

曾经也纠结过用特性判断还是try catch。

既然语言本身提供了try catch,必要的时候还是可以用的,虽然某些大牛强调禁用trycatch,甚至写进了“开发规范”。

这里考虑更大的兼容性,比如"{age:28}"用JSON.parse不能成功解析会报异常,这样就跳到了catch中,catch使用new Function解析,可以解析成功。当然如果age加上引号是没问题的。


看了一下jQuery的源码,它的parseJSON方法可能更好些~
	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 );
		
		// Make sure the incoming data is actual JSON
		// Logic borrowed from http://json.org/json2.js
		if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
			.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
			.replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {

			// Try to use the native JSON parser first
			return window.JSON && window.JSON.parse ?
				window.JSON.parse( data ) :
				(new Function("return " + data))();

		} else {
			jQuery.error( "Invalid JSON: " + data );
		}
	},
0 请登录后投票
   发表时间:2010-08-20  
/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")  
        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")  
        .replace(/(?:^|:|,)(?:\s*\[)+/g

这个正则表达式
0 请登录后投票
   发表时间:2010-08-20  
这个也是从json官网弄来的吧
0 请登录后投票
   发表时间:2010-08-21  
特殊字符能处理吗?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics