JavaScript中JSON对象

来源:互联网 发布:天龙八部灵性算法 编辑:程序博客网 时间:2024/05/29 03:50

JSON对象的定义

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript(w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON语法

JSON的语法可以表示以下三种类型的值。

  • 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null 。但JSON不支持JavaScript中的特殊值undefined。
  • 对象:对象作为一种复杂数据类型,表示的是一组有序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。
  • 数组:数组也是一种复杂的数据类型,表示一组有序的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型,如简单值、对象或数组。

简单值

最简单的JSON数据形式就简单值,例如:

"Hello word";5

Javascript字符串与JSON字符串的最大区别在于,JSON字符串必须使用双引号(单绰号会导致语法错误)。
布尔值和null也是有效的JSON形式。但是,在实际应用中,JSON更多地用来 表示更复杂的数据结构,而简单值只是整个数据结构中的一部分。

对象

JSON对象的表现形式如下:

{    "name": "TOM",    "age": 30}

JSON对象表现形式和JavaScript中的对象字面量是有些相似,但是,有两处不一样。第一没有声明变量,第二没有末尾的分号。这里注意对象的属性必须加双引号,这是在JSON中必需的。属性的值可以是简单值,也可以是复杂类型值;

数组

JSON中第二种复杂的数据类型就是数组,JSON数组采用的就是JavasScript中数组字面量形式。例如:

[30,"Hello",true]

同样要注意,JSON数组也没有变量和分号。把数组和对象结构起来,可以构成更复杂的数据集合,例如:

[    {        "title":"JavaScript 高级编程",        "price":99    },    {        "title":"Java 高级编程",        "price":96    }]

JSON的解析与序列化

JSON之所以流行,拥有与JavasScript类似的语法并不是全部原因,更重要的一个原因,可以把JSON数据结构解析为有用的JavasScript对象。然后以JavasScript对象的语法来访问,假设把JSON数组结构保存到book变量中:

book[0].title

支持这个JSON对象的浏览器有IE8、Firefox3.5+、Safari4+、Chrome和Opera10.5+,对于较早版本的浏览器可以使用一个第三方提供的插件

JSON对象提供两个方法

方法名 解释 stringify() 把JavasScript对象序列化为JSON字符串 parse() 把JSON字符串解析为原生的JavasScript值

JSON.stringify()

默认情况下,JSON.stringify()输出的JSON字符串不包含任何空字符或缩进;在序列化JavasScript对象时,所有函数及原型都会被有意忽略,不体现在结果中。此外,值为undefined的任何属性也都会被路过。

序列化选项

JSON.stringify()除了要序列化的JavasScript对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化JavasScript对象。第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。单独或组合使用这两个参数,可以更全面深入地控制JSON的序列化。

  • 过滤结果
    第二个参数是数组形式:
var book = [    {        "title":"JavaScript 高级编程",        "price":99    },    {        "title":"Java 高级编程",        "price":96    }];JSON.stringify(book,['title']);// "[{"title":"JavaScript 高级编程"},{"title":"Java 高级编程"}]"

第二个参数是函数

var book = [    {        "title":"JavaScript 高级编程",        "price":99    },    {        "title":"Java 高级编程",        "price":96    }];JSON.stringify(book,function(key,value){    // 过滤掉title属性及属性值    if(key =="title") {        return undefined;    }    return value;});//"[{"price":99},{"price":96}]"
  • 字符串缩进
var book = [    {        "title":"JavaScript 高级编程",        "price":99    },    {        "title":"Java 高级编程",        "price":96    }];JSON.stringify(book,null, 4);

输出结果:

[    {        "title": "JavaScript 高级编程",        "price": 99    },    {        "title": "Java 高级编程",        "price": 96    }]

注意第三个参数值最大的缩进数为10,所有大于10的值都会自动转换为10;
如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符(不再使用空格)。在使用字符串的情况下,可以将缩进字符设置为制表符,或者两个短划线之类的任意字符。
缩进字符串最长不能超过10个字符长,如果超过10个,结果中将只出现前10个字符;

toJSON()方法
var book = {        "title":"JavaScript 高级编程",        "price":99,        toJSON:function(){            return this.title;        }};JSON.stringify(book);//"JavaScript 高级编程"

toJSON()可以作为函数过滤器的补充,因此理解序列化的内部十分重要。假设把一个对象传入JSON.stringify()。序列化对象的顺序如下。

  • 如果存在toJSON()方法而且能通过它取得有效的值,则调用访方法,否则,按默认顺序执行序列化。
  • 如果提供了第二个参数,应用 这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
  • 对第(2)步返回的每个值进行相应的序列化。
  • 如果提供了第三个参数,执行相应的格式化。

解析选项

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用。这个函数被称为还原函数。
如果还原函数返回undefined,则表示要从结果中删除相应的键,如果返回其他值,则将该值插入到结果中;

var str = "{\"name\":\"TOM\",\"age\":30}";JSON.parse(str, function(key,value){  if(key =="age") {    return undefined;  }    return value;}); // Object {name: "TOM"}
原创粉丝点击