(转)JavaScript中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的特殊实现

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); 

转自:http://www.jb51.net/article/25988.htm

时间: 2024-10-06 14:39:06

(转)JavaScript中JSon转对象的相关文章

JavaScript中json的一些操作

JavaScript中json的一些操作: $.ajax( { type :"POST", url :"${ctx}/cardprofile/list4Select.do?cardProductId="+cardProduct.id, dataType :"json", async : false, data : { }, error : function(err) { escmAlert(err); }, global :false, succ

在JavaScript中重写jQuery对象的方法

jQuery是一个很好的类库,它给我们解决了很多的客户端编程,任何东西都不是万能的,当它不能满足我们的需求时我们需要对它进行重写,同时也不要影响其原有的功能或者修改其原有的功能:我现在的web应用程序大多数时候的数据交互都是通过Ajax来完成的,这样就可以将一些隐藏字段的数据保存在HTML标签的属性中,使HTML标签的代码量减少,如:ID,Timestamp等等,这些不需要用户输入但又不得不提交的字段,通过表单提交的做法是 <input name="ID" value="

JavaScript中的String对象

String对象提供的方法用于处理字符串及字符. 常用的一些方法: charAt(index):返回字符串中index处的字符. indexOf(searchValue,[fromIndex]):该方法在字符串中寻找第一次出现的searchValue.如果给定了fromIndex,则从字符串内该位置开始搜索,当searchValue找到后,返回该串第一个字符的位置. lastIndexOf(searchValue,[fromIndex]):从字符串的尾部向前搜索searchValue,并报告找到

JavaScript中创建字典对象(dictionary)实例

这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象仅仅是个数组,无法提供通过关键字来获取保存的数据,jQuery源码中提供了一种非常好的方式来解决这个问题,先看一下源码: 复制代码代码如下: function createCache() { var keys = []; function cache(key, value) {  // Use (k

JavaScript中的Math对象

Math对象中提供的计算功能执行起来比你在代码中写的js要快得多,这是它的一个很好的优点. 属性: 属性 说明 Math.E 即常量e的值 Math.LN10 ln10 Math.LN2 ln2 Math.LOG2E 2为底e的对数 Math.LOG10E 10为底e的对数 Math.PI π Math.SQRT1_2 1/2的平方根 Math.SQRT2  2的平方根 方法: Math.min():求最小值 Math.max():求最大值 Math.max(1,2,3,4,5) // 5 Ma

项目中发现的一些关于JavaScript中JSON的注意点

一个是怎样创建JSON: var obj = {}; obj['name'] = value; obj['anotherName'] = anotherValue; 假设要创建多级的JSON,则: ips[ipId] = {}; ips[ipId]['name'] = value; ips[ipId]['anotherName'] = anotherValue; 注意要用bracket[]而不能用点. 来訪问json object bracket尽管写起来麻烦一些,可是能够避免非常多错误! ht

JavaScript中的事件对象

JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有关的信息.下面将会讲到DOM中的事件对象.IE中的事件对象以及跨浏览器的事件对象三个部分. 对于事件处理程序,大家可以看我的博文<JavaScript中的五种事件处理程序>. 第一部分:DOM事件对象 兼容DOM的浏览器会将一个event对象传入到事件处理程序中,无论是HMTL特性.DOM0级还是

javascript中的Array对象的slice()、call()、apply()详解

来51cto已经很多年,就是没怎么写文字,今天来一篇介绍JS的,文章篇幅不是很大,大部分内容是我参考了别人的博客后经过自己理解,自己整理的.方便自己以后回顾知识.文中涉及到javascript中的Array对象的slice().call().apply(); slice()方法,在我之前做的项目中,有两种数据类型下用到过.第一种是string类型的,还有一种是Array对象: string对象的slice(): 定义和用法 slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部

JavaScript中通过arguments对象实现对象的重载

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* *1.js 中不存在函数的重载 2.js函数定义时候的形参个数,和执行时候时,传递的实参的个数可以不一样. 3.js执行时候,会将真实的参数,封