城东小巷分享 http://blog.sciencenet.cn/u/chengdong166

博文

JSON in JavaScript Learning

已有 6712 次阅读 2012-7-23 22:31 |个人分类:JS学习|系统分类:科研笔记| xml, Javascript, json

JSON in JavaScript

JSONjavaScript Object NotationJavaScript对象表示法)是一种轻量级的数据交换格式。由于JSON利用JavaScript的一些模式(如ECMAScript3版中JavaScript对象字面量)表示结构化数据,因此常被看做是JavaScript的一个严格的子集合。因为可以把JSON直接传给JavaScripteval()方法,使其转换成JavaScript对 象,所以不需要创建DOM。另外,很多编程语言,例如C++C#ColdFusionJavaPerlPHPPython,都有针对JSON的解析器和序列化器

1、   JSON建构于两种结构

1、  “名/值”对的集合。

2、  值的有序列表。(在大部分语言中,它被理解为数组)。

2、   JSON具有的形式

1、  对象是一个无序的“名/值”对集合。它起始于“{”结束于“}”,“名/值”对之间用“,”分开,每个名称后面跟一个“:”。

2、  数组是值(value)的有序集合。它起始于“[”结束于“]”,每个值之间用“,”隔开。

3、  值可以是用双引号(double quotes)括起来的字符串(string)、数值(Number)、true or falsenull、对象或者数组。

这些结构可以嵌套(nested)。

3、   JSON的数据结构

JSON数据类型包括:字符串、数值(Number)、布尔值(true/false)、null、对象,数组。(JSON不支持JavaScript中的特殊值undefined。)

注意:JSON在字符串的表示方式上与JavaScript最大的不同的是:JSON中的字符串必须为双引号,使用单引号会产生语法错误。

JSON字符串必须使用双引号括起来。它们使用标准的JavaScript转义序列。因此在以下列字符的前面要添加一个反斜线:”(引号)、b(空格)、n(新行)、f(换页)、r(回车)、t(水平定位)、u(为Unicode字符增加4个数位)、(反斜线符号)、/(正斜杠符号)。

4、   JSON对象表示方法

JSON在表示对象时,一定要注意一下规则:

规则1JSON中无变量的概念;

规则2:末尾无分号(;);

规则3:对象的属性必须加双引号(“”),且同一个对象中不能出现同名属性;

规则4:属性的值可以是简单的数据类型,如字符串、数值、布尔值、null;也可以是复杂型数据类型,如对象、数组。

规则5:对象中可以嵌套对象。例如创建JOSN文本形式的member对象:

      {

        “id”: 1

“member”:  [

                        {

                            name:Tom,

                            age:22

                    },

                   {

                        name:WangMing,

                        age:25

                    }

                ]

}

5、   JSON数组的表示方法

JSON数组也没有变量和分号。对象和数组嵌套起来,可以形成较为复杂的数据结构。例如:

[

    {

        “title”: “professional JavaScript”,

        “authors”: {

            “ChengDong”

},

“edition”:3

},

{

        “title”: “professional JavaScript”,

        “authors”: {

            “name”: chengdong,

            “age”: 25

},

“edition”:3

}

]

6、   JSON解析与序列化

JSON除拥有与JavaScript类似的语法外,还能够把JSON数据结构解析为JavaScript对象。在早期版本的浏览器中,使用eval()方法对JSON数据结构求值存在一定的风险,可能会执行一些恶意代码,因此在ECMA Script5中定义了全局变量JSON对象,支持这个对象的浏览器与IE8+fireFox 3.5+Safari 4+ChromeOpera 10.5+

下面例子中讲述了JSON对象的stringify()parse()的使用方法,其中前者表示将JavaScript对象序列化为JSON数据格式,而后者表示将JSON数据格式解析为原生的JavaScript值。

 

7、   Demo

window.onload = function(){

    // JavaScript创建的person对象

    var person = {

       name: ["ChengDong", "ZhangSan"],

       age: 25,

       book: {

           title: "Professional JavaScript",

           author: "Nicholas C. zakas",

           year: 2011,

           edition:undefined//值为undefined的属性将会被跳过执行

       }

    }

    //JavaScript对象序列化为一个JSON字符串

    var jsonText = JSON.stringify(person);

    alert(jsonText);//outputs: {"name":["ChengDong","ZhangSan"],"age":25,"book":{"title":"Professional JavaScript","author":"Nicholas C. zakas","year":2011}}

    //stringify(obj, array):返回数组中只包含的属性的/.

    var jsonTest2 = JSON.stringify(person, ["name", "age", "book"]);

    alert(jsonTest2);//outputs: {"name":["ChengDong","ZhangSan"],"age":25,"book":{}}

    //数组包含的属性必须同属于一个对象

    var jsonTest3 = JSON.stringify(person, ["name","year"]);

    alert(jsonTest3);//{"name":["ChengDong","ZhangSan"]}

    //stringify(obj, function):通过函数过滤要转换为JSON格式的字符串.

    var jsonTest4 = JSON.stringify(person, function(key, value){

       switch (key) {

           case "name":

              return value.join(",");

           //返回undefined,序列化为JSON字符串时将被省略执行

           case "age":

              return undefined;

           default:

              return value;

       }

    });

    alert(jsonTest4);//outputs: {"name":"ChengDong,ZhangSan","age":25,"book":{"title":"Professional JavaScript","author":"Nicholas C. zakas"}}

   

    //stringify(person,null,4),数值:每个级别缩进4个空格;字符串:缩进字符(可以是空格等)

    var jsonTest5 = JSON.stringify(person,null,"--");

    alert(jsonTest5);

   

    var book = {

       title: "Professional JavaScript",

       "authors": ["Nicholas C.Zakas"],

       edition:3,

       year:2011,

       person: {

           name: "ChengDong",

           age: 25

       },

       //在对象上调用toJSON方法,返回其自身的JSON数据格式(其实是一个自定义过滤条件)

       toJSON: function(){

              //return this.title;//outputs: "Professional JavaScript"

              return undefined;//outputs: undefined

              //return this.name;//outputs: undefined

           }

    }

   

    var toJSONTest = JSON.stringify(book,["year","edition"]);

    alert(toJSONTest);

   

    var book2 = {

       "title": "Professional JavaScript",

       "authors": ["Nicholas C.Zakas"],

       "edition": 3,

       "year": 2011,

       releaseDate: new Date(2011,11,1)

    }

   

    var jsonText01 = JSON.stringify(book2);

    alert(jsonText01);//outputs: {"title":"Professional JavaScript","authors":["Nicholas C.Zakas"],"edition":3,"year":2011,"releaseDate":"2011-11-30T16:00:00.000Z"}

    //通过函数进行过滤

    var bookCopy = JSON.parse(jsonText01, function(key, value){

       var val = (key === "releaseDate") ? new Date(value) : value ;

       return val

    });

   

    alert(bookCopy.releaseDate.getFullYear());

 

}



https://blog.sciencenet.cn/blog-448935-595095.html

上一篇:DOM学习小结(一)
下一篇:Ajax学习笔记
收藏 IP: 122.82.230.*| 热度|

1 蒋迅

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-2 20:43

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部