一、前言
- JSON是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据
- JSON是一种数据格式,不是一种编程语言
- 虽然具有相同的语法形式,但JSON并不从属于JavaScript
二、语法
- JSON的语法可以表示三种类型
- 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持JavaScript中的特殊值undefined
- 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对。每个键值对中的值可以是简单值、复杂数据类型的值
- 数组:复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型:简单值、对象、数组
- JSON不支持变量、函数或对象实例
1.简单值
- JSON字符串必须使用双引号
- 布尔值和null也是有效的JSON形式
2.对象
- 没有变量声明
- 没有末尾的分号
- 对象的属性必须加双引号
- 同一个对象中绝对不应该出现两个同名属性
{
"name":"Nicholas",
"age":29,
"school":{
"name":"mary",
"location":"north"
}
}
3.数组
- 同样没有变量和分号
- 对象和数组通常是JSON数据结构的最外层形式(当然,这不是强制规定的),利用他们能创造出各种各样的数据结构
{
"title":"hello",
"authors":["jack",29],
"edition":3,
"year":2011
}
三、解析与序列化
- 可以把JSON数据结构解析为有用的JavaScript对象
2.使用方便
1.JSON对象
- 全局对象JSON。这个对象有2个方法
- stringify()
- 用于把JavaScript对象序列化为JSON字符串
- 默认情况下返回的字符串不包含任何空格字符或缩进
- 在序列化JavaScript对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined的任何属性也会被跳过,结果中最终都是有效JSON数据类型的实例属性
- parse()
- 把JSON字符串解析为原生JavaScript值
- 通过parse()返回的JavaScript与传入stringify()的JavaScript虽然具有相同的属性,但没有什么关系
var book={
title:"hello",
authors:["jack",29],
edition:3,
year:2011
};
var jsontext=JSON.stringify(book);
var bookcopy=JSON.parse(jsontext);
2.序列化选项
- JSON.stringify()还可以接受两外两个参数
- 第一个参数是个过滤器:数组/函数
- 数组,则方法返回的结果中只包含数组中列出的属性
JSON.stringify(book,["title"])
,则返回的字符串中只包含title这个属性{"title":"hello"}
- 函数,接收两个参数:属性名和属性值
- 属性名只能是字符串,而在值并非键值对结构的值时,键名可以是空字符串
- 如果函数返回了undefined,那么相应的属性会被删除
- 数组,则方法返回的结果中只包含数组中列出的属性
第二个参数是一个选项,用于控制结果中的缩进和空白符
- 如果这个参数是一个数值,那它表示的是每个级别缩进的空格数
- 如果这个参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符(不再使用空格)
- 只要传入有效的控制缩进的参数值,结果字符串就会包含换行符
- 缩进的数值不能超过10,如果大于10就会自动转换为10
- 缩进的字符串最长不能超过10个字符串,如果超过,结果中将只出现前10个字符
var jsontext=JSON.stringify(book,null,4); var jsontext1=JSON.stringify(book,null,"--");
可以给对象定义toJSON()方法,返回其自身的JSON数据格式
- 原生Date对象有一个toJSON()方法,能够将JavaScript的Date对象自动转换成ISO 8601日期字符串(与在Date对象上调用toISOSstring()的结果完全一样)
- 可以为任何对象添加toJSON()方法
- 可以让toJSON()方法返回任何值,他都能正常工作。如果返回undefined,此时如果包含它的对象嵌入在另一个对象中,会导致它的值变成null,二如果它是顶级对象,结果就是undefined。
var book={ title:"hello", authors:["jack",29], edition:3, year:2011, toJSON:function(){ return this.title; } }; var jsontext=JSON.stringify(book);//"hello"
- 序列化对象的顺序:
(1). 如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身
(2). 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值
(3). 对第(2)步返回的每个值进行相应的序列化
(4). 如果提供了第三个参数,执行相应的格式化
3.解析选项
- JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。称为还原函数
- 与过滤函数相似,传入属性名和属性值,返回一个值
如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。
var book={ title:"hello", authors:["jack",29], edition:3, year:2011, releaseDate:new Date(2011,11,1); }; var jsontext=JSON.stringify(book); var bookcopy=JSON.parse(jsontext,function(key,value){ if(key=="releaseDate"){ return new Date(value); } else{ return value; } }); alert(bookcopy.releaseDate.getFullYear());//2011