JSON 对象与字符串之间转换(兼容浏览器)

转载 2011年01月12日 17:19:00

标准参考

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)
result in other browsers result in IE6 IE7 and 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>

各浏览器中表现如下:

所有浏览器 solution

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

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

 

相关文章推荐

JSON字符串转换为JSON对象,兼容IE7等浏览器

1>jQuery插件支持的转换方式:  代码如下: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json...

JSON.parse 的浏览器兼容性

IE8及以上 都支持 参考文档:https://msdn.microsoft.com/library/cc836466(v=vs.94).aspx 在以下文档模式中...
  • ISaiSai
  • ISaiSai
  • 2015年08月17日 10:02
  • 10344

JSON.parse()和JSON.stringify()兼容低版本浏览器

json.parse和json.stringify这两个方法在ie8及以上浏览器都能够使用,但关于兼容低版本的浏览器,可以用两种方法解决。 1.可以引入json2.js,下载地址 https://...

ie8兼容模式下JSON.parse无法识别

问题分析:   将字符串转换成json对象,IE8兼容模式不支持通过JSON.parse将字符串转换成JSON对象的方法。虽然我是IE8的浏览器,用IE8打开也能够支持, 但是WINFORM开发下调用...

linux下查看所有用户及所有用户组的信息

groups 查看当前登录用户的组内成员 groups gliethttp 查看gliethttp用户所在的组,以及组内成员 whoami 查看当前登录用户名 /etc/group文件包含所...

Linux命令(26):Linux查看用户和组

将用户分组是Linux系统中对用户进行管理及控制访问权限的一种手段。每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。当一个用户同时是多个组中的成员时,在 /etc/pas...
  • MTbaby
  • MTbaby
  • 2016年09月21日 18:29
  • 3172

解析JSON对象与字符串之间的相互转换

解析JSON对象与字符串之间的相互转换 作者: 字体:[增加 减小] 类型:转载 本篇文章主要是对JSON对象与字符串之间的相互转换进行了详细的介绍,需要的朋友可以过来参考...

JSON字符串与Java对象之间的转换

由于JSON数据格式的诸多优点,现在就数据传输这个方面已经完胜XML,成为当下比较流行数据传输格式。所以越来越多的项目采用了这种格式进行前后台数据的传送。咱公司后台主要用的是java平台相关的技术,因...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JSON 对象与字符串之间转换(兼容浏览器)
举报原因:
原因补充:

(最多只允许输入30个字)