JSON是一种表示结构化数据的格式,而非编程语言,相对于XML的烦琐,JSON是在js中读写结构化数据的更好的方式,可以将JSON直接传递给eval(),而不需要创建DOM对象;当然并非只有JS可以使用JSON,很多的编程语言都具有针对JSON的解析器环绕序列化器
JSON语法
可以用来表示三种类型的值
-
简单值:可以表示数值,布尔,字符串,null
注意:①不支持 undefined; ②JSON字符串必须使用双引号
-
对象:表示的是一组无序的键值对,其中的值可以是简单类型的也可以是复杂类型的
JSON中的对象和JS中的对象是不一样的 ①JSON中没有变量的概念,因此没有变量的声明 ②末尾没有分号 ③对象的属性必须加双引号
-
数组:表示的是一组有序的值的序列(JS中字面量的方式)
注:JSON数组中也没有变量和分号 将对象和数组结合起来可以构成更为复杂的数据集合
//js对象
var obj={
name:"zs",
age:23
};
// JSON对象
{
"name":"zs",
"age":23
}
var arr=[12,"hi",true];//js中的数组
[12,"hi",true]//JSON 中的数组
解析和序列化
早期JSON解析器使用的是js中的eval()函数,eval()函数可以解析,解释并返回JS对象和数组 但在一些旧版本的浏览器中使用eval()对JSON数据结构求值会存在风险;
ES5定义了一个原生的JSON对象,JSON.stringify()方法用来将对象序列化为JSON字符串,JSON.parse()方法 是将JSON数据解析为JS对象
序列化
JSON.stringify()
默认情况下,输出的JSON字符串是不含有空格字符或缩进的,在序列化js对象时,所有的函数和原型成员都会被忽略,且值为undefined的属性也会被跳过。
JSON.stringify()还可以接收两个参数,用于指定以不同的方式序列化js对象。参数一:过滤器(可以是数组,也可以是函数);参数二:是一个选项,表示是否在JSON字符中保留缩进(缩进的字符或空格的最大长度为10,所有大于10的值都会自动转换为10)
var dog={
name:'xg',
age:3,
weight:'15kg'
};
var jsonText=JSON.stringify(dog,["name","weight"],4);//缩放4个空格
var jsonText2=JSON.stringify(dog,null,'--');
console.log(jsonText);
console.log(jsonText2);
结果:
{
"name": "xg",
"weight": "15kg"
}
{
--"name": "xg",
--"age": 3,
--"weight": "15kg"
}
解析选项
JSON.prase()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用