`
zhouyrt
  • 浏览: 1124829 次
  • 性别: 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字符串互转(4种转换方式)

    //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2>浏览器支持的转换方式(Firefox,chrome,opera,safari,ie9,ie8)等浏览器: 代码如下: JSON.parse(jsonstr); //可以将json字符串转换成json...

    json对象转为字符串,当做参数传递时加密解密的实现方法

    在Firefox,chrome,opera,safari,ie9,ie8等高级浏览器直接可以用JSON对象的stringify()和parse()方法。 JSON.stringify(obj)将JSON转为字符串。 JSON.parse(string)将字符串转为JSON格式; 上面的转换可以这么写...

    JavaScript实用代码小技巧

    我们平时经常会用到JSON 对象,比如当我们要实现对象的深拷贝时,我们可以用JSON 对象的JSON.stringify和JSON.parse 来拷贝一个完全一样的对象,而不会对原对象产生任何引用关系。在使用localStorage 时,也会用到它...

    JS18-LocalStorage:从LocalStorage获取数据。 从LocalStorage删除和更新项目

    在Chrome中-检查-应用程序-存储-本地存储 只需将数据保存到字符串 但是,我们可以使用一种称为JSON.stringyfy的方法 localStorage.getItem('allMonths'); const monthsArray = JSON.parse(months); console....

    web-rtmp-streamer:使用js和Flash来实现rtmp流媒体

    web-rtmp-streamer本项目使用js+swf实现了一个rtmp推流器。...解决了原版使用JSON.parse()前没判断类型导致推流失败的bug。剥离原版各种http请求(如心跳接口、获取网易云cdn地址等),实现纯净无监控推流器。

    woocommerce-paybox-gateway1.0.1

    ” Firefox:“ SyntaxError:JSON.parse:JSON数据的第1行第1列出现意外字符” IE:“ SyntaxError:无效字符”修复return_url(Paybox IPN) IPN网址现在默认为您的网站主网址。 因此不需要/ autoresponse页面

    js-ajax:XMLHttpRequest的一个小包装

    当接收application/json ,它不能在IE7或以下版本中使用,因为不支持JSON.parse 。 如果这是,则使用类似Douglas Crockford的东西。 其他一切似乎都起作用。例子使用它再简单不过了: var fajax = require('fajax')...

    deathcube-successor-tower:CS1010R项目制作了一款塔防游戏,教给学生OOP概念

    前提浏览器需要支持HTML5,还需要支持JSON.stringify和JSON.parse方法。 其中应包括IE 11 +,Firefox 36 +,Chrome 40 +,Opera 27+和其他现代浏览器。 入门打开index.html并单击“开始游戏”以使用

    dom-event-to-json

    例如,没有Mac的iOS上的Chrome 用法 parse(object:Object, [depth:Int]):Object 例子 import { parse } from 'dom-event-to-json' element . addEventListener ( 'click' , ( event ) => { fetch ( '/debug' , {...

    自动化执行-钉钉机器人通知.pdf

    self.failed = root.getAttribute('failed') self.skipped = root.getAttribute('skipped') #构建的次数统计在json⽂件中 file = open(REPORT_URL_FILE,'r') self.reportUrl=json.load(file)['reportUrl'] #发送报告...

    python 淘宝爬虫

    from urllib.parse import quote_plus import re import json import itertools import sys import requests from queue import Queue from threading import Thread URL_BASE = '...

    steamdb-js:通过抓取Steamdb网站以获取Steam游戏信息来提供JSON数据的库

    steamdb-js 一个库,以获取信息,所有地区的价格以及游戏的屏幕截图作为JSON数据安装npm i --save steamdb-js或者,如果您使用的是毛线: yarn add steamdb-js用法/示例(CommonJS): const { Game } = require ( ...

    性能检查员「Performance inspector」-crx插件

    Not able to use JSON.stringify to parse them to String. update: 11/21/2014 1. fix bug of get short name of entries 2. update layout for help doc update: 11/09/2014 1. fix bug of no response for tab ...

    jQuery 1.5 API 中文版

    objjQuery.parseJSON( str ) Data functions $.clearQueue( [name] ) $.dequeue( [name] ), jQuery.dequeue( [name] ) objjQuery.data( element, key ), jQuery.data( ) obj.data( ), .data( key ) $.data( key, val...

    recursion:基于递归的填充

    parseJSON() stringifyJSON() 某些代码可能是用ES6编写的,可能需要进行编译才能进行测试。 要求 在Chrome chrome://flags/#enable-javascript-harmony.上启用了ES6 chrome://flags/#enable-javascript-...

    vessel:快速的高级Web爬网Ruby框架

    与Chrome一样快,简单却可扩展。 它是基于Ruby高级Web爬网框架,用于从网站中提取所需的数据。 它可以用于各种场景,例如数据挖掘,监视或历史档案。 对于自动化测试,我们建议使用 。 感谢Evrone。 阅读有关...

Global site tag (gtag.js) - Google Analytics