Chrome中JSON.parse的特殊实现

 更新时间:2011年01月12日 17:26:42   作者:  
ECMA 262 Edition5 中提供了原生的JSON支持,其中JSON.parse用来将字符串转成成json,见ECMA 262 Edition5 15.12.2。另见:字符串转换成json的三种方式
IE8/Firefox3.5+/Chrome4/Safari4/Opera10 已实现该方法。使用方式很简单:
复制代码 代码如下:

var str = '{"name":"jack"}';
var json = JSON.parse(str);
alert(json.name);

在以上实现该方法的浏览器中都会弹出“jack”。
如果给Object.prototype添加一个解析json的方法(某人可能会强烈反对这么干污染了原生对象,这里纯粹为了讨论)
复制代码 代码如下:

Object.prototype.parseJSON = function () {
return JSON.parse(this);
}

因为所有的对象都继承了Object的方法,这时候可以直接这么用了,
复制代码 代码如下:

var str = '{"name":"jack"}';
var json = str.parseJSON();
alert(json.name);

str.parseJSON()时,parseJSON内部的this就指向了str。这时候并非所有浏览器都能解析成功。

IE8/Firefox/Safari/Opera仍然会弹出“jack”,Chrome中则报错了:Uncaught illegal access。
为什么这样写Chrome就不支持呢?比较两种方式,传给JSON.parse的参数一个是字符串str,一个是this。貌似这两个没区别?
当str.parseJSON()时,parseJSON内部的this指向了应该就是str。修改下parseJSON方法:
复制代码 代码如下:

Object.prototype.parseJSON = function () {
alert(typeof this);
return JSON.parse(this);
};

重新执行,可以发现parseJSON弹出的是object,可能这就是区别了。直接new一个字符串就能看到明显的效果了
复制代码 代码如下:

var js = JSON.parse(new String('{"name":"jack"}'));
alert(js.name);

以上代码除Chrome报错外,其它浏览器均执行正常。
基本得出结论:
Chrome中,JSON.parse的第一个参数只能是字符串,不能是对象(包括new String方式也不支持)
再回到上面给Object.prototype添加一个解析json的方法,如果要兼容所有浏览器,可以这么写:
复制代码 代码如下:

Object.prototype.parseJSON = function () {
return JSON.parse(this.toString());
}
var str = '{"name":"jack"}';
var json = str.parseJSON();
alert(json.name);

2010-10-09 : 该BUG在Chrome6中已经修复.

相关文章

  • json 入门基础教程 推荐

    json 入门基础教程 推荐

    在异步应用程序中发送和接收信息时,可以选择以纯文本和 XML 作为数据格式。掌握 Ajax 的这一期讨论另一种有用的数据格式 JavaScript Object Notation(JSON),以及如何使用它更轻松地在应用程序中移动数据和对象。
    2009-10-10
  • 教你如何使用PHP输出中文JSON字符串

    教你如何使用PHP输出中文JSON字符串

    PHP 和 JavaScript 交互其实很方便,PHP 原生也提供了对 JSON 格式的支持。主要包括 JSON 编码和解码两个函数:
    2014-05-05
  • 深入分析jsonp协议原理

    深入分析jsonp协议原理

    JSONP的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了。
    2015-09-09
  • 用nodejs写的一个简单项目打包工具

    用nodejs写的一个简单项目打包工具

    项目是模块加载的,类似require.js的用法,所以简单写了一个js打包工具
    2013-05-05
  • 把普通对象转换成json格式的对象的简单实例

    把普通对象转换成json格式的对象的简单实例

    下面小编就为大家带来一篇把普通对象转换成json格式的对象的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • 深入javascript json QQ网页登陆

    深入javascript json QQ网页登陆

    下面是个类似QQ网页登陆的一个对话框(DIV), js + json 动态生成.
    2009-07-07
  • XML的代替者----JSON

    XML的代替者----JSON

    XML的代替者----JSON...
    2007-07-07
  • Json对象与Json字符串互转(4种转换方式)

    Json对象与Json字符串互转(4种转换方式)

    Json字符与Json对象的相互转换方式有很多,接下来将为大家一一介绍下,感兴趣的朋友可以参考下哈,希望可以帮助到你
    2013-03-03
  • JS中JSON.parse(JSON.stringify())实现深拷贝

    JS中JSON.parse(JSON.stringify())实现深拷贝

    深拷贝就是完全拷贝一份新的对象,本文主要介绍了JS中JSON.parse(JSON.stringify())实现深拷贝,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • JSON 数据格式详解

    JSON 数据格式详解

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成
    2017-09-09

最新评论