zoukankan      html  css  js  c++  java
  • jquery中的 parseJSON() 源码分析

    parseJSON: function( data ) {
            // Attempt to parse using the native JSON parser first
            if ( window.JSON && window.JSON.parse ) {
                return window.JSON.parse( data );
            }
    
            if ( data === null ) {
                return data;
            }
    
            if ( typeof data === "string" ) {
    
                // Make sure leading/trailing whitespace is removed (IE can't handle it)
                data = jQuery.trim( data );
    
                if ( 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 );
        }

    主要的难点:

    if ( rvalidchars.test( data.replace( rvalidescape, "@" )
                        .replace( rvalidtokens, "]" )
                        .replace( rvalidbraces, "")) ) {
    
                        return ( new Function( "return " + data ) )();
                    }


        检测逻辑借助于 json2.js , 以下正则在头部定义了
    
        用于匹配转义字符
            rvalidescape = /\(?:["\/bfnrt]|u[0-9a-fA-F]{4})/g
    
        用于匹配有效字符值 'str' true false null Number
            rvalidtokens = /"[^"\
    
    ]*"|true|false|null|-?d+(?:.d*)?(?:[eE][+-]?d+)?/g
    
        用于匹配正确的左方括号
            rvalidbraces = /(?:^|:|,)(?:s*[)+/g
    
        用于检测字符串中知否只含有执行字符 ] , : { }
            rvalidchars = /^[],:{}s]*$/
    
        检测传入的字符串是一个 切实 的 JSON 数据
            先把转义字符替换成@, 
            再把有效字符替换为"]", 
            在删除正确的左方括号, 
            最后检测剩下的字符串是否指包含指定的几个字符。 
    
        特别说明:
            此处注释出自 @高云 的书中原文【小编能力有限,解释不清这些正则的意思】
       
    JSON2.JS的源码解读:https://segmentfault.com/a/1190000009388927
  • 相关阅读:
    Django 之 CBV & FBV
    如何在Pycharm设置ES6语法环境
    RabbitMQ_消息队列基本使用_2
    RabbitMQ_消息队列基本使用_1
    HTML 之 Table 表格详解
    Datetime 模块求日期差
    vue实例属性之methods和computed
    性格测试
    vue中的组件
    vue中的表单
  • 原文地址:https://www.cnblogs.com/huaan011/p/7228553.html
Copyright © 2011-2022 走看看