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
  • 相关阅读:
    Sqlite—修改语句(Update)
    Python—图形界面开发
    Django—模型
    Sqlite—删除语句(Delete)
    Shell—详解$( )、$(( ))、``与${ }的区别
    Shell—详解$0、$1、$2、$#、$*、$@、$?、$$变量
    排名靠前的博客
    系统架构--逻辑层
    互联网系统的通用架构笔记
    各类开源协议总结
  • 原文地址:https://www.cnblogs.com/huaan011/p/7228553.html
Copyright © 2011-2022 走看看