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

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

阅读更多

使用ajax的开发项目过程中,经常需要将json格式的字符串返回到前端,前端解析成js对象(JSON )。

 

ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法。

 

1,eval方式解析,恐怕这是最早的解析方式了。如下:

 

function strToJson(str){
     var json = eval('(' + str + ')');
     return json;
}

 

记得别忘了str两旁的小括号。

 

2,new Function形式,比较怪异哦。如下

 

function strToJson(str){
    var json = (new Function("return " + str))();
    return json;
}

 

3,使用全局的JSON对象,如下:

 

function strToJson(str){
    return JSON.parse(str);
}

 

目前 IE8(S)/Firefox3.5+/Chrome4/Safari4/Opera10 已实现了该方法,以下是部分资料:

 

http://blogs.msdn.com/ie/archive/2008/09/10/native-json-in-ie8.aspx

https://developer.mozilla.org/en/Using_JSON_in_Firefox

 

使用JSON.parse需严格遵守JSON规范,如属性都需用引号引起来,如下

 

var str = '{name:"jack"}';
var obj = JSON.parse(str); // --> parse error
 

name没有用引号引起来,使用JSON.parse所有浏览器中均抛异常,解析失败。而前两种方式则没问题。

 

 

另见:Chrome中JSON.parse的特殊实现

 

 

 

分享到:
评论
18 楼 free_wxl 2012-08-03  
建议使用第三种方法,上面二种都会产生内存泄露。
17 楼 微雨骑驴入剑门 2012-03-22  
学习了,感谢lz分享
16 楼 4769946 2010-05-25  
zhouyrt 写道
nenyalanye_1 写道
第二种怎么理解? 这种JSON.parse(str); 要不要导什么js函数

不用,JSON是全局的直接使用。IE8/Firefox3.5+/Chrome4/Safari4/Opera10支持。


难道第二种IE67不支持的??
15 楼 Qiao.Gbin 2010-05-24  
创建一个script节点
然后script.text = data
这样可以吧
14 楼 satanest 2010-03-21  
第一种和第二种都有安全隐患哎
第三种在ie6,7支持不了
13 楼 chpublish1012 2010-03-18  
第一种如果不是json格式的会报错
后两种是什么情况呀
12 楼 greatghoul 2010-03-18  
呵呵,我也一起码在用第一种,不过第二种应该要比第一种快很多才是。
11 楼 zhouyrt 2010-03-18  
nenyalanye_1 写道
第二种怎么理解? 这种JSON.parse(str); 要不要导什么js函数

不用,JSON是全局的直接使用。IE8/Firefox3.5+/Chrome4/Safari4/Opera10支持。
10 楼 nenyalanye_1 2010-03-17  
第二种怎么理解? 这种JSON.parse(str); 要不要导什么js函数
9 楼 RednaxelaFX 2010-03-17  
zhouyrt 写道
RednaxelaFX 写道
John Resig老大推荐用Crockford的json2js,可以参考


呵,这个说法不对。
1,(EMCA262-V5)明确规定了对JSON本地支持,所以首选是原生态的JSON.parse方法
2, eval解析存在bug,见http://dev.jquery.com/ticket/4680

ps:jq1.4.1后加入了parseJSON方法,先使用JSON.parse解析,浏览器不支持则使用new Function形式解析。

json2.js本来就会在浏览器原生支持JSON.parse的时候选用原生版本,而且它跟ES5是API兼容的。在ES5还没完全普及的现状下,John Resig老大推荐用json2.js主要是为了现在就能用跟ES5兼容的API,日后能平滑过渡到ES5——只要去掉一个import就换过来了。
8 楼 zhouyrt 2010-03-17  
RednaxelaFX 写道
John Resig老大推荐用Crockford的json2js,可以参考


呵,这个说法不对。
1,(EMCA262-V5)明确规定了对JSON本地支持,所以首选是原生态的JSON.parse方法
2, eval解析存在bug,见http://dev.jquery.com/ticket/4680

ps:jq1.4.1后加入了parseJSON方法,先使用JSON.parse解析,浏览器不支持则使用new Function形式解析。
7 楼 jaxchow 2010-03-17  
每一种很不好!!!太危险了,AIR里不允许使用!还是第三种好
6 楼 xiaoyiz 2010-03-17  
qinshujin 写道
学了一年多的java web 开发今天又学了个新名词json
  请问下json是一种数据类型吗?

轻量级的数据传送格式 是一种文本格式 (保存数据和传送数据的一种方式)不是数据类型
5 楼 qinshujin 2010-03-16  
学了一年多的java web 开发今天又学了个新名词json
  请问下json是一种数据类型吗?
4 楼 RednaxelaFX 2010-03-16  
John Resig老大推荐用Crockford的json2js,可以参考
3 楼 linkobe 2010-03-16  
eval 那两个括号很邪恶,刚入门的时候被这个搞了半天。

而且YUI的compressor不推荐用此方式,对压缩混淆有影响
2 楼 zzhonghe 2010-03-16  
还有一种是解析字符串的key和value,并生成Object,这是Json官网比较推荐的一种方式,好处是提高了安全性。eval执行的代码有可能是恶意代码。

http://www.JSON.org/json_parse.js
1 楼 felsenlee 2010-03-16  
一直在用第一中,原来还有更优雅得写法

相关推荐

Global site tag (gtag.js) - Google Analytics