`
zhouyrt
  • 浏览: 1162008 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Chrome中JSON.parse的特殊实现

    博客分类:
  • BUG
阅读更多

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.stringify(obj)和JSON.parse(string)

    在较新的浏览器(如Firefox,Chrome,Opera,Safari,IE9及以上版本)中,内置了JSON对象,可以直接使用`JSON.stringify()`和`JSON.parse()`方法。然而,对于较旧的浏览器,如IE8的兼容模式及以下版本,需要引入第三...

    chrome(json).rar_JSON

    在JavaScript中,有内置的`JSON.parse()`函数可以实现这一点。例如: ```javascript let jsonString = '{"name":"John", "age":30, "city":"New York"}'; let jsonObject = JSON.parse(jsonString); console.log...

    字符串转换成json 的三种方式

    在Chrome浏览器中,`JSON.parse`还有一些特殊的实现细节,这些可能会影响特定场景下的性能和行为,开发者应当了解并根据需求进行适配。 总结,将字符串转换为JSON对象时,首选的、最安全的方法是使用`JSON.parse`...

    将json字符串转换为对象

    例如,在实际开发中,开发者可能会使用在线的JSON格式化和解析工具,如JSONLint,来验证JSON字符串的正确性,或者使用浏览器的开发者工具(如Chrome的DevTools)中的Console来快速测试JSON.parse()。 至于...

    JSON序列化与解析原生JS方法且IE6和chrome测试通过.docx

    在提供的代码示例中,展示了一个使用原生JS实现的JSON序列化和解析的方法,这个方法同时在IE6和Chrome下测试通过: ```javascript // 序列化 function toJSON(obj) { var arr = []; for (var key in obj) { var ...

    js中将字符串转换成json的三种方式.docx

    `JSON.parse`在现代浏览器中已经被广泛支持,如IE8以上、Firefox3.5+、Chrome4+、Safari4+和Opera10。对于不支持`JSON.parse`的老版本浏览器,可以使用polyfill库,如`json3.js`来提供兼容性支持。 **其他相关知识...

    JavaScript中解析JSON数据的三种方法

    接下来,new Function方法利用了JavaScript中的Function构造函数来创建新的函数,它允许你从一个字符串参数中动态创建新的函数体,通过这种方式可以间接地实现JSON字符串的解析。new Function方法的使用如下所示: ...

    12JavaScript异步Ajax与json总结.docx

    在Ajax请求中,通常使用`JSON.stringify()`将JavaScript对象转换为JSON字符串,然后发送给服务器,服务器处理后返回JSON数据,前端再通过`JSON.parse()`转换回JavaScript对象。 综上所述,JavaScript异步Ajax技术和...

    jsonView.zip

    JSON.parse()和JSON.stringify()分别是JavaScript中用于将JSON字符串转换为JavaScript对象和将JavaScript对象转换为JSON字符串的方法。 此外,理解HTTP协议也是至关重要的,因为JSON通常作为HTTP响应的一部分。GET...

    json解析

    以JavaScript为例,`JSON.parse()`方法的源码实现涉及对JSON字符串进行词法分析和语法解析,这通常由浏览器内部的引擎实现,开发者无需直接操作。 总结,JSON解析是Web开发中的重要技能,理解其基本结构和解析机制...

    JS中对象与字符串的互相转换详解

    总结来说,JS中对象与字符串的互相转换是通过JSON.parse()和JSON.stringify()方法实现的,它们是JSON数据格式的原生支持方法,安全且广泛被现代浏览器支持。对于旧版浏览器(如IE8及以下版本),则需要引入相应的库...

    js中将字符串转换成json的三种方式

    在IE8(标准模式)、Firefox 3.5+、Chrome 4+、Safari 4+以及Opera 10等较新的浏览器中,`JSON.parse`已被实现。如果你需要兼容旧版浏览器,可能需要引入polyfill库,如`json3.js`,以提供对旧版JavaScript引擎的...

    在web开发中更加富有效率的使用JSON

    4. **Chrome开发者工具**:在网络面板中,可以查看请求的响应体,包括JSON数据,便于分析和调试。 5. **JSON Schema**:定义JSON数据的结构,可以用于验证和文档化,确保数据的一致性。 总的来说,熟练掌握JSON的...

    ajax + json 练习

    - **开发工具**:开发者可以使用浏览器的开发者工具(如Chrome的DevTools)来调试Ajax请求和查看返回的JSON数据。 - **在线验证**:有在线工具如JSONLint可以验证JSON数据的正确性。 - **IDE插件**:许多IDE(如...

    json工具 可格式化json串

    3. **JSON与JavaScript对象的关系**:在JavaScript中,JSON字符串可以通过`JSON.parse()`方法转化为JavaScript对象,反之,JavaScript对象也可以通过`JSON.stringify()`方法转化为JSON字符串。 4. **使用"JsonView...

    Node.js-一个很棒的json到json映射器mapper

    JSON处理在Node.js中通常是通过内置的`JSON.parse()`和`JSON.stringify()`方法进行,但为了更复杂的转换需求,使用专门的JSON映射库会更加便捷和高效。 在压缩包文件名"awesome-json2json-master"中,"awesome"通常...

    谷歌浏览器格式化显示JSON数据

    总之,通过安装和使用如JSON-Handle这样的浏览器扩展,开发者可以在Chrome浏览器中轻松查看和理解JSON数据,提高工作效率,从而更好地进行Web应用的开发和调试工作。了解和掌握这类工具的使用,对于现代前端开发人员...

    chrome-todoapp:带有 chrome 本地存储和通知的 Chrome 待办事项扩展应用程序

    在这个chrome-todoapp-master压缩包中,我们可以找到这些组件的源代码,学习如何将Chrome的本地存储和通知功能集成到扩展应用中,从而更好地理解Chrome扩展的开发流程和实现机制。通过分析和修改源码,开发者可以...

Global site tag (gtag.js) - Google Analytics