> Javascript > jQuery技术内幕:深入解析jQuery架构设计与实现原理 2.8.3 解析JSON和XML:jQuery.parseJSON( data )、jQuery.parseXML( data ) 2014-01-21 13:27:44 我要投稿
本文所属图书 > jQuery技术内幕:深入解析jQuery架构设计与实现原理
本书由阿里巴巴资深前端开发工程师撰写,从源代码角度全面而系统地解读了jQuery的17个模块的架构设计理念和内部实现原理,旨在帮助读者参透jQuery中的实现技巧和技术精髓,同时本书也对广大开发者如何通过阅读源 立即去当当网订购
1.jQuery.parseJSON( data )
方法jQuery.parseJSON( data )接受一个格式良好的JSON字符串,返回解析后的JavaScript对象。如果传入残缺的JSON字符串可能导致程序抛出异常;如果不传入参数,或者传入空字符串、null、undefined,则返回null。
如果浏览器提供了原生方法JSON.parse(),则使用该方法解析JSON字符串;否则使用
( new Function( "return"+ data ) )()解析JSON字符串。
方法jQuery.parseJSON( data )的相关代码如下所示:
555 parseJSON: function( data ) {
556 if ( typeof data !== "string" || !data ) {
557 return null;
558 }
559
560 // Make sure leading/trailing whitespace is removed (IE can't handle it)
561 data = jQuery.trim( data );
562
563 // Attempt to parse using the native JSON parser first
564 if ( window.JSON && window.JSON.parse ) {
565 return window.JSON.parse( data );
566 }
567
568 // Make sure the incoming data is actual JSON
569 // Logic borrowed from json.org/json2.js
570 if ( rvalidchars.test( data.replace( rvalidescape, "@" )
571 .replace( rvalidtokens, "]" )
572 .replace( rvalidbraces, "")) ) {
573
574 return ( new Function( "return " + data ) )();
575
576 }
577 jQuery.error( "Invalid JSON: " + data );
578 },
第556~561行:对于非法参数一律返回null。如果参数data不是字符串,或者可以转换为false,则返回null。
第561行:移除开头和末尾的空白符。在IE 6/7中,如果不移除就不能正确的解析,例如:
typeof ( new Function( 'return ' + '\n{}' ) )();
// 返回"undefined"
第564~566行:尝试使用原生方法JSON.parse()解析JSON字符串,并返回。
JSON对象含有两个方法:JSON.parse()和JSON.stringify(),用于JSON字符串和JavaScript对象之间的相互转换。下面是它们的语法和使用示例。
JSON.parse()解析JSON字符串为 JSON对象,其语法如下:
JSON.parse(text[, reviver])
// text 待解析为 JSON 对象的字符串
// reviver 可选。在返回解析结果前,对解析结果中的属性值进行修改
JSON.parse()的使用示例如下所示:
JSON.parse( '{ "abc": 123 }' );
// {"abc": 123 }
JSON.parse( '{ "abc": 123 }', function( key, value ){
if( key === '' ) return value;
return value * 2;
} );
// {"abc": 246 }
JSON.stringify()转换JSON对象为JSON字符串,其语法如下:
JSON.stringify( value[, replacer [, space]] )
// value 待转换为 JSON 字符串的对象
// replacer 可选。如果 replacer 是函数,转换前先执行 replacer 改变属性值,如果函数 replacer 返回 undefined,则对应的属性不会出现在结果中;如果 replacer 是数组,指定最终字符串中包含的属性集合,不在数组 replacer 中的属性不会出现在结果中
// space 增加转换后的 JSON 字符串的可读性
JSON.stringify()的使用示例如下所示:
JSON.stringify( { a: 1, b: 2 } );
// '{"a":1,"b":2}'
JSON.stringify( { a: 1, b: 2 }, function( key, value ){
if( key === '' ) return value;
if( key === 'a' ) return value * 10;
if( key === 'b' ) return undefined;
return value;
} );
// '{"a":10}'
JSON.stringify( { a: 1, b: 2 }, ['b'] );
// '{"b":2}'
JSON.stringify( { a: 1, b: 2 }, null, 4 );
// '{\n "a": 1,\n "b": 2\n}'
JSON对象、JSON.parse()、JSON.stringify()在ECMAScript 5中被标准化,IE 8以下的浏览器不支持。关于JSON规范和浏览器实现的更多信息请访问以下地址:
(ECMAScript 5第15.12节)
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON
下面回到对方法jQuery.parseJSON()的分析中来。