拖欠措施接受一个JSON字符串,重返解析后底对象。

流传一个怪的JSON字符串会抛来一个老。比如下边的都是非正常的JSON字符串:

  • {test: 1} ( test
    没有包围双引号)
  • {‘test’: 1}
    (使用了单引号而休是对引号)

此外,假使你什么还不传播,或者一个空字符串、null或undefined,parseJSON都会师回到
null 。

源码分析:

parseJSON: function( data ) {
   if ( typeof data !== "string" || !data ) {
       return null;
 }

率先对参数举行过滤,即使data不是字符串或者好转移为false则随之重返null

// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim( data );

于解析往日率先要清理掉首尾空格,否则在ie中会见并发解析失利

// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
      return window.JSON.parse( data );
 }

因为ie8以上以及w3c标准的浏览器提供了然析的法,所以要浏览器协助先行使用

// 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 ) )();

}

对于不援助JSON对象的浏览器有第一保证传入的字符串是官的,通过几个正则式来举行周详,最终回来解析后的结果

// JSON RegExp
rvalidchars = /^[\],:{}\s]*$/,
rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,

随即几乎独刚刚则以jQuery构造函数中创建

new Function( "return " + data )

Function构造函数接受字符串参数,然后将这个字符串参数在函数内部分析,下面举例:

var json='[{"success":"0"}]';
console.log(new Function('var data='+json));
/* (function() {
var data=[{"success":"0"}]
})*/

这般平昔叫函数示例一个由实施加return就算会回来解析后底结果

jQuery.error( "Invalid JSON: " + data );

只要尽及此表达json无法解析,调用error方法报错,最终附上完整连续源码:

    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 );
    },

 

 

相关文章

网站地图xml地图