标准参考

JSON 是一种数据交换格式,RFC 4627 对 JSON 进行了详细描述。

根据 ECMA-262(ECMAScript)第 5 版中描述,JSON 是一个包含了函数 parse 和 stringify 的简单对象。       parse 函数用来解析一个 JSON 文本(一个 JSON 格式的字符串)到一个 ECMAScript 值(例如 JSON 对象被解析为 ECMAScript 对象,       JSON 数组被解析为 ECMAScript 数组,其它类型以此类推);stringify 则相反,它是将一个 ECMAScript 值解析为一个 JSON 格式的字符串,      比如将一个 ECMAScript 对象解析为一个 JSON 对象的字符串。

关于 JSON 的详细信息,请参考 RFC 4627http://json.org

关于 JSON 对象的更多信息,请参考 ECMA-262 5th Edition 中 15.12 The JSON Object。

问题描述

IE6 IE7 IE8(Q) 不支持 JSON 对象。

造成的影响

使用了 JSON 对象的脚本代码在 IE6 IE7 IE8(Q) 中运行的时候可能会抛出异常,导致功能失效。

受影响的浏览器

IE6 IE7 IE8(Q)  

问题分析

JSON 对象是在 ECMAScript 第 5 版中实现的,此版于 2009 年 12 月发布;IE6 IE7 与 IE8(Q) (IE8(Q) 相当于 IE 5.5) 发布时间比较早,没有在其 Javascript 引擎中实现该对象。

分析以下代码:

<script type="text/javascript">
window.onload = function(){
var info = document.getElementById("info");
if(window.JSON){
var jsonStr = '{"name": "w3help", "url": "www.w3help.org", "tech": ["js", "HTML", "CSS", 5, 4.01, 2.1],'
+ '"online": true, "category": {"RCA": "Root Cause Artical", "KB":"Knowledge Base"},'
+ '"version": 1}', p, w3help; w3help = JSON.parse(jsonStr);
for(p in w3help)
info.innerHTML += p + " : " + w3help[p] + "<br/>";
info.innerHTML += JSON.stringify(w3help);
} else
info.innerHTML = "Not support JSON object.";
}
</script>
<div id="info" style="width:350px;"></div>

以上代码首先探测是否在 window 下存在 JSON 对象,然后简单测试了 JSON 对象的 parse 和 stringify 函数并输出(反)解析结果。执行代码,各浏览器中表现如下:

IE8(S) Firefox Chrome Safari Opera IE6 IE7 IE8(Q)

解决方案

可以使用 window.eval() 或 new Function(){} 的方式解析 JSON 格式字符串。如:

<script type="text/javascript">
window.onload = function(){
var info = document.getElementById("info"),
jsonStr = '{"name": "w3help", "url": "www.w3help.org", "tech": ["js", "HTML", "CSS", 5, 4.01, 2.1],'
+ '"online": true, "category": {"RCA": "Root Cause Artical", "KB":"Knowledge Base"},'
+ '"version": 1}', p, w3help; //使用两种简单的方式解析 JSON 格式字符串
json1 = eval("(" + jsonStr + ")"),
json2 = (new Function("return " + jsonStr))(); for(p in json1)
info.innerHTML += p + " : " + json1[p] + "<br/>";
info.innerHTML += "-----------------------<br />";
for(p in json2)
info.innerHTML += p + " : " + json2[p] + "<br/>";
}
</script>
<div id="info" style="width:350px;"></div>

各浏览器中表现如下:

所有浏览器

可见,以上代码可以作为 JSON.parse() 跨浏览器的简单替换方案。同样 JSON.stringify() 可以通过判断类型加算法实现,这里不再赘述。

需要注意的是,这种解析 JSON 格式字符串的简单实现存在安全问题,被插入的恶意 JSON 字符串(比如获取用户的 cookie 信息)可能被解析并执行。      可以使用一些经过验证的安全成熟的的解决方案,例如 json2.js 中的 JSON.parse() 或 jQuery.parseJSON()

IE6 IE7 IE8(Q) 不支持 JSON 对象的更多相关文章

  1. IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常

    标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...

  2. [IE兼容性] Table 之边框 (IE6 IE7 IE8(Q) 中 cellspacing 属性在重合的边框模型的表格中仍然有效)

    在 IE6 IE7 IE8(Q) 中,在通过 border-collapse:collapse 使用表格的重合边框模型后,其 cellspacing 属性仍然有效: 在 其他浏览器 中,此时的 cel ...

  3. RB1001: IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常

    标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...

  4. SJ9012: IE6 IE7 不支持 JSON 对象

    标准参考 JSON 是一种数据交换格式,RFC 4627 对 JSON 进行了详细描述. 根据 ECMA-262(ECMAScript)第 5 版中描述,JSON 是一个包含了函数 parse 和 s ...

  5. 解决IE6/IE7/IE8不支持before,after问题

    对从事web开发的朋友来讲,低版本的IE永远是一个痛点,不支持最新技术(如css3,html5). 在现在web开发中使用图标字体已经很广泛,如Font Awesome,Bootstrap等,字体图片 ...

  6. 让IE6/IE7/IE8浏览器支持CSS3属性

    让IE6/IE7/IE8浏览器支持CSS3属性 一.下载 您可以狠狠地点击这里:ie-css3.htc,这个玩意儿是让IE浏览器支持CSS3表现的关键东东. 二.上面的是什么东西 首先说说.htc文件 ...

  7. 如何让低版本的IE浏览器(IE6/IE7/IE8)支持HTML5 header等新标签

    html5提供的一些新标签(article,aside,dialog,footer,header,section,footer,nav,figure,menu)使用起来非常的方便,但是低版本的IE浏览 ...

  8. 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法--(转)

    如有雷同,不胜荣幸,若转载,请注明 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了boot ...

  9. 让IE6/IE7/IE8支持HTML5标签的js代码

    让IE(ie6/ie7/ie8)支持HTML5元素,我们需要在HTML头部添加以下JavaScript,这是一个简单的document.createElement声明,利用条件注释针对IE来调用这个j ...

随机推荐

  1. [terry笔记]物化视图 materialized view基础学习

    一.物化视图定义摘录:     物化视图是包括一个查询结果的数据库对像(由系统实现定期刷新数据),物化视图不是在使用时才读取,而是预先计算并保存表连接或聚集等耗时较多的操作结果,这样在查询时大大提高了 ...

  2. Java实现多线程邮件发送

    利用java多线程技术配合线程池实现多任务邮件发送. 1.基本邮件发送MailSender package hk.buttonwood.ops.email; import java.io.File; ...

  3. ociuldr 支持分多个数据文件

    在审计工作,将几亿条的oracle数据通过sqlserver自带工具导入到sqlserver中,速度不是特别的理想,虽然通过视图方式能提高一些速度,但是既不简洁,也不方便. 用ociuldr工具,可以 ...

  4. Android---WebView显示Html乱码问题

    webView.loadData(result,"text/html","UTF-8"); 反正是用上面的方法无法解决乱码的问题. 使用下面的方法就能完美解决了 ...

  5. Android--WebView的一些配置项

    //打开页面时,自适应屏幕 wv_showWeb_webActivity.getSettings().setUseWideViewPort(true);//设置此属性可以任意比例缩放 wv_showW ...

  6. hdu 4857 逃生

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能 ...

  7. golang:slice陷阱

    slice陷阱,slice底层指向某个array,在赋值后容易导致array长期被引用而无法释放

  8. 通过firefox+ProxySelector+dtunnel_lite实现代理上网

    通过firefox+ProxySelector+dtunnel_lite实现代理上网 dtunnel_lite:http://dog-tunnel.tk/下载lite版本就可以 远端:./dtunne ...

  9. android NDK开发环境搭建

    android NDK开发环境搭建 2012-05-14 00:13:58 分类: 嵌入式 基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclip ...

  10. UISlider swift

    // // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...