`
代昊鑫
  • 浏览: 19797 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

原生JSON对象及兼容问题的解决

阅读更多

我们在使用JSON数据时遇到最多的操作是对JSON格式的数据进行序列化和反序列化操作,在这里我想介绍下什么是JSON数据,JS原生的JSON对象提供的支持及浏览器兼容的问题。

 

1、什么是JSON

 

http://json.org/中是这样介绍JSON:

 

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(ECMA-262标准第三版)的一个子集。采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON采用key/value的形式来表示数据,其中使用“{}”表示对象,而“[]”则表示数组,详细的语法可以参考json.org

 

JSON对象:{"name":"LiLei","age":19,"sex":"male"}
JSON数组:[
             {"name":"LiLei","age":19,"sex":"male"},
             {"name":"HanMei","age":18,"sex":"famale"}
           ]

 

就web开发来讲,JSON数据有三个好处:

 

简洁,方便前台数据操作 - 与XML相比,JSON的分隔符仅限于引号、冒号、逗号、大括号和中括号,并且没有闭合标签的要求,这使得JSON结构更加的简洁。

体积小,传输快。

易用性 - 由于JSON的语法本身就是JavaScript的一个子集,因此对于一个JSON结构几乎不需要额外的解析和查找,可以像使用原生JavaScript对象那样去使用JSON,而XML则需要通过DOM解析来访问。

 

因此,JSON在当前的Web开发用中使用的越来越广泛。其中最常用的两个操作是序列化和反序列化。目前,很多JavaScript库提供都提供了对着两个操作的支持,不过随着ECMA起草了JSON序列化和反序列化的相关标准后,各大浏览器也相应的增加了对JSON的原生支持。

 

2、原生JSON对象

 

目前支持原生JSON对象的浏览器包括:IE8、Firefox3.5以及Chrome3.0/4.0。原生的JSON对象是一个只包括parse方法与stringify方法的纯粹的对象,用于解析和构建JSON文本。

2.1、 JSON.parse(text [ , reviver ] )

 

parse方法的作用是进行反序列化,即将一个符合JSON语法的字符串解析成一个JavaScript对象。该方法可以接受两个参数text与reviver,其中reviver是可选的。text是需要反序列化的字符串,reviver则是一个可选的函数,在反序列化的过程中,每当解析到对象的一个属性时都会将key和value作为参数传递给reviver并执行,之后将返回的结果作为当前key对应值(如果解析的是数组则传递的是当前元素的索引以及元素本身)。如果返回的是undefined则会在解析后的对象中删除对应的属性。具体的使用参见下面的代码:

//简单对象
var str = '{"name":"LiLei","age":19,"sex":"male"}';
var obj = JSON.parse(str);
alert(obj.name);  //LiLei
   
var obj2 = JSON.parse(str,function(k,v){
       if(k == "name"){
           return "HanMeiMei";
       }
       return v;
});
alert(obj2.name);  //HanMeiMei
 
//数组
var str = '[{"name":"LiLei","age":19,"sex":"male"},'+
              '{"name":"Lucy","age":17,"sex":"female"}]';
var obj = JSON.parse(str);
alert(obj[0].name);// LiLei
alert(obj[1].name);//Lucy
   
var obj2 = JSON.parse(str,function(k,v){
    if(k == "name"){
         return "HanMeiMei";
     }
     return v;
});
alert(obj2[0].name); //HanMeiMei
alert(obj2[1].name); //HanMeiMei
//复杂对象
var str = '{"class":"javascript",'+
    '"teacher":{"name":"HanMeiMei","age":28,"sex":"female"},'+
    '"students":[{"name":"LiLei","age":19,"sex":"male"},'+
              '{"name":"Lucy","age":17,"sex":"female"}]}';
var obj = JSON.parse(str);
alert(obj.teacher.name); // HanMeiMei
alert(obj.students[0].name); //LiLei
   
var obj2 = JSON.parse(str,function(k,v){
     if(k == "teacher"){
         v.name = "Poly";
     }
     return v;
});
alert(obj2.teacher.name);  // Poly
alert(obj2.students[0].name); // LiLei
alert(obj2.students[1].name); // Lucy

 

  注意:使用JSON.parse的时候,对象的每个属性都必须用双引号括起来,否则会抛出异常;

 

var str = '{company:"kedacom"}';
var json = JSON.parse(str);  //解析出现异常
var str2 = "{'company':'kedacom'}";
var json2 = JSON.parse(str2);  //解析出现异常

2.2、JSON.stringify(value [ , replacer [ , space ] ] )

stringify方法的作用是进行序列化,即将一个JavaScript对象序列化成JSON结构的字符串。该方法最多可以包含3个参数:

value - 需要序列化的JavaScript对象。

replacer - 可选,可以是函数或者数组,

    如果是函数,则用于过滤序列化的结果。在序列化的执行过程中,每当遍历到对象的一个属性时,都会将属性的key和value传递给replacer并执行,并将执行结果作为该属性的值。

    如果是一个数组,则必须保证数组中的每个元素都是字符串,该数组参数用于指定value中需要进行序列化的属性,如果是对数组进行序列化则会忽略数组形式的replacer参数。

    在使用函数作为replacer时需要注意的是,由于replacer返回的内容仍然会执行序列化,因此如果是返回对象则层次不要太深,不然很容易出“堆栈溢出”的异常,此外如果返回的是undefined则属性会被直接删除掉,而不会出现在字符串中。

       space - 可选,可以是数字或字符串。用于格式化输出,使输出的JSON字符串更易于阅读,这在需要人工检查时非常的有用。如果是数字则表示每一级缩进的空格数,如果是字符串则表示每一级缩进都使用该字符串。使用示例:

     1)只有一个参数的情况下:

 

var student = {"name":"LiLei","age":30,"location":"China"};
var json = JSON.stringify(student);
document.write(student);  // [object Object]
document.write(json);
// {"name":"LiLei","age":"30","location":"China"}

 

    2)第二个参数存在,并且是函数

var student = {"name":"LiLei","age":30,"location":"China"};
var json = JSON.stringify(student,function(k,v){
        if(k == "name"){ return "poly"; }
        return v;
});
document.write(json);
//{"name":"poly","age":30,"location":"China"}
 
var students = ["LiLei","poly","hanmeimei"];
var json = JSON.stringify(students, function (key,value) {
    return value.toString().toUpperCase();
 });
document.write(json);// "LILEI,POLY,HANMEIMEI"

 

    3)第二个参数存在,并且是数组

 

// value是对象,并且replacer为数组时,返回只包含有replacer指定属性的对象
var student = {"name":"LiLei","age":30,"location":"China"};
var json = JSON.stringify(student,["name","location"]);
document.write(json); //{"name":"LiLei","location":"China"}
// value是数组,并且replacer为数组时,replace参数被忽略
var students = ["LiLei","poly","hanmeimei"];
var json = JSON.stringify(students);
var json2 = JSON.stringify(students, ["0","2"]);
document.write(json); // ["LiLei","poly","hanmeimei"]
document.write(json2); //["LiLei","poly","hanmeimei"]

 

 

   4)第三个参数存在,并且是数字,表示缩进几个字符,此时最大值为10

 

var student = {"name":"LiLei","age":30,"location":"China"};
var json = JSON.stringify(student,["name","location"]); 
alert(json);
var student = {"name":"LiLei","age":30,"location":"China"};
var json = JSON.stringify(student,["name","location"],4); 
alert(json);

 
         
 

5)第三个参数存在,并且是转义字符

 

var student = {"name":"LiLei","age":30,"location":"China"};
var json = JSON.stringify(student,["name","location"]);
alert(json);
var student = {"name":"LiLei","age":30,"location":"China"};
var json = JSON.stringify(student,["name","location"],"\t");
alert(json); 

                 

6)  第三个参数存在,并且仅仅是字符串,就在每行输出值的时候把这些字符串附加上去就OK。最大长度也是10个字符

 

var student = {"name":"LiLei","age":30,"location":"China"};
var json = JSON.stringify(student,["name","location"]);
alert(json);
var student = {"name":"LiLei","age":30,"location":"China"};
var json = JSON.stringify(student,["name","location"],"kedacom");
alert(json);

                       

 

3、原生JSON的的浏览器兼容

 

目前支持原生JSON对象的浏览器包括:IE8(S)、Firefox3.5以及Chrome3.0/4.0,对于更低版本的浏览器支持在网络上又很多的解决方案,目前使用最为广泛和成熟的解决方案是在项目中引入json.js库,该扩展库是由大师Douglas Crockford扩展实现(有兴趣的童靴可以读下源码),在最近的一次更新中可以看到如下建议,json.js文件应该使用被最新的json2.js替换。

       

/*
    json.js
    2013-05-26

    Public Domain

    No warranty expressed or implied. Use at your own risk.

    This file has been superceded by http://www.JSON.org/json2.js

    See http://www.JSON.org/js.html
*/

 

https://github.com/douglascrockford/JSON-js可以下载到json.js和json2.js两个文件。

下面就通过在IE6中引入json2.js进行一个简单测试:

 

//没有引入json2.js库的版本
<!DOCTYPE HTML>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script>
if(JSON){
    var student = {"name":"LiLei","age":30,"location":"China"};
    var s = JSON.stringify(student,["name","location"]);
    alert(s);
}else{
    alert("不支持JSON对象");
}
</script>
</head><body></body></html>

 

执行报错:

 
          
 

引入json2.js,代码如下:

……
<script src="json2.js" type="text/javascript"></script>
…… 

          执行结果:

 
                                    
 

4、小结

 

认识javascript也不短的时间了,一直不知道原生JSON对象的存在,知道最近想着从头整理下自己的javascript知识,才知道它的存在,惭愧啊惭愧啊。于是乎,在网上找了些资料,并结合一些例子,希望能给童靴们一些帮助。

 

5、参考

 

http://technet.microsoft.com/zh-cn/sysinternals/cc836459(v=vs.94)

http://json.org/

https://github.com/douglascrockford/JSON-js

  • 大小: 7.2 KB
  • 大小: 20.2 KB
  • 大小: 7.1 KB
  • 大小: 7.3 KB
  • 大小: 7.1 KB
  • 大小: 7.1 KB
  • 大小: 7.1 KB
  • 大小: 25.8 KB
分享到:
评论

相关推荐

    json2.js 字符串转转json对象工具

    总的来说,json2.js是解决JSON处理兼容性问题的一个工具,它提供了一种安全且标准化的方式来在JavaScript中进行JSON字符串与对象之间的转换,尤其对于那些不支持原生JSON操作的老版本浏览器而言。

    使用JQuery实现从JSON对象转换为form提交数据

    - 考虑到兼容性问题,确保所有目标浏览器都支持jQuery库,或者使用原生JavaScript方法进行替代。 总结,通过jQuery我们可以方便地将JSON对象转换为适合表单提交的格式,并利用Ajax方法发送到服务器。这极大地提高...

    js将excel转化成json 对象

    在前端开发中,有时我们需要处理来自用户上传的Excel文件数据,并将其转化为JSON对象以便进一步处理或与后端交互。这个过程通常涉及到文件读取、数据解析以及格式转换。以下是一些关于如何使用JavaScript实现这一...

    用来解决iejson不兼容的js

    然而,旧版本的IE(尤其是IE6、IE7和部分IE8)并不原生支持JSON对象,这给开发者带来了困扰,因为JSON在现代Web应用中被广泛用于数据传输。 描述中提到的"用来解决iejson不兼容的js"很可能就是指`json2.js`这个文件...

    javascript json字符串到json对象转义问题

    本文将深入探讨JavaScript中JSON字符串到JSON对象的转换,并解决其中的转义问题。 首先,我们需要理解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集。JSON字符串是由...

    JSON2解决JSON未定义

    2. 如果JSON对象不存在,JSON2.js会创建一个JSON对象,并添加parse和stringify两个方法。 - `JSON.parse()` 方法接收一个JSON字符串作为参数,将其转换为JavaScript值(对象或原始值)。在JSON2.js中,它通过使用...

    json-c 一个用于c语言的json解析库,很强大

    5. **内存管理**:`json-c`库负责JSON对象的内存管理,提供了一套完整的内存分配和释放机制,避免了内存泄漏问题。 6. **错误处理**:在解析和生成过程中遇到错误时,`json-c`会提供相应的错误信息,帮助开发者调试...

    json/json2.js两个版本

    这个版本可能包含了更多的兼容性和性能优化,例如处理旧版IE浏览器的问题,这些浏览器默认不支持原生的JSON对象。 两个版本的对比可能涉及到以下方面: 1. **API一致性**:`json2.js`可能更加接近ECMAScript 5及...

    jquery cookie 插件 (支持json对象) 可以跟jquery 集成 也可以单独使用

    因为早期的JavaScript版本不原生支持JSON,所以这个文件可能包含了JSON对象的解析和序列化功能,确保在所有浏览器中都能正确地处理JSON数据。 使用这个jQuery Cookie插件,你可以: 1. 设置Cookie:通过调用`$....

    json-writer.zip_C++_JSON_Json::Writer_jsonwriter_解析json

    1. **创建JSON对象**:允许用户通过API创建JSON对象,如对象(key-value对)、数组、字符串、数值、布尔值和null。 2. **序列化**:将C++的数据结构转换为JSON格式的字符串。这通常涉及遍历数据结构并调用适当的...

    json-develop

    3. **遍历和操作JSON对象**:支持访问和修改JSON对象的属性,以及遍历JSON数组。 4. **类型转换**:自动处理JSON值与C++原生类型之间的转换。 在"json-develop"这个SDK中,开发者可以期待以下关键特性: - **API...

    json2 常用js

    总之,JSON2.js是一个针对老版本浏览器的JSON解析和序列化库,它弥补了这些浏览器缺乏原生JSON支持的不足。了解并熟练使用JSON2.js可以帮助开发者确保在各种环境下都能正确地处理JSON数据,提升应用程序的兼容性和...

    json2.js json.js

    在JavaScript中,原生的JSON对象在ECMAScript 5版本(ES5)及更新的环境中被内置,提供了`JSON.parse()`和`JSON.stringify()`两个核心方法。然而,在ES5之前的版本,如IE6和IE7,对JSON的支持并不完全。这就是json2....

    IE中兼容模式下JSON未定义

    这是因为JSON(JavaScript Object Notation)是ECMAScript 5引入的一个内置对象,而在IE8及以下版本中并未原生支持JSON。这篇博文()很可能详细解释了如何在不支持JSON的IE浏览器中处理这个问题。 首先,我们需要...

    json2 json

    "json2"是Douglas Crockford开发的一个JavaScript库,主要用于解决早期版本的Internet Explorer(特别是IE6和IE7)不支持内置的JSON对象和方法的问题。在这些浏览器中,`JSON.stringify()`方法是缺失的,无法将...

    json2-min.js(亲测可用)

    `json2-min.js` 文件是一个针对JSON的JavaScript库,主要功能是为那些不支持原生JSON的旧版浏览器提供JSON的解析和序列化功能。 在JavaScript中,JSON主要用于数据传输,特别是在与服务器进行AJAX通信时。原生的...

    json2.js+介绍

    `json2.js` 是Douglas Crockford开发的一个JavaScript库,主要用于处理JSON格式数据,特别是在那些不支持原生JSON解析和序列化的老版本浏览器中。 在JavaScript中,`JSON.stringify()`方法用于将JavaScript值转换为...

    Delphi_JSON delphi7解析JSON控件

    6. 兼容性:既然能在“新测”中使用,说明控件可能已经解决了与最新Delphi版本不兼容的问题,或者至少在一定程度上支持了新的编译器特性。 综上所述,"Delphi_JSON delphi7解析JSON控件"是一个对Delphi 7开发至关...

    JSON 对象未定义错误的解决方法

    在一些旧版本的浏览器,尤其是Internet Explorer的某些兼容性模式下,可能不支持JSON对象,因此可能会出现“JSON未定义”的错误。 当你遇到“JSON对象未定义”的错误时,这通常意味着当前的JavaScript环境中没有...

Global site tag (gtag.js) - Google Analytics