JOSN的可以表示为以下三种类型
- 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串,数值,Boolean和null,但是不支持undefined.
- 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对,每个键值对可以是简单值,也可以是复杂数据类型的值.
- 数组:数组也是一种复杂数据类型,表示的是一组有序值得列表,可以通过数值索引来访问其中得值,数组可以是任意类型-简单值,数组,对象.(我们通常要将被序列化的对象写成数组形式,为了便于访问)
简单值:简单值与JavaScript的区别为字符串类型必须加双引号(单引号会导致语法错误),没有undefined.
对象:与JavaScript的对象相比,JSON对象没有声明变量(JSON没有变量的含义),其次,没有末尾的分号(因为不是JavaScript语句,所以不需要加分号),属性名必须使用双引号括起来,示例:
{
"name":"json",
"age":23,
"school":{
"name":"JSON",
"profession":"student"
}
}
注意:这个对象虽然有两个"name"属性,但是由于它们分别属于不同对象,所以这样完全没有问题,但是一个对象中不应该有两个相同的属性名.
数组
JOSN中的第二种复杂数据类型是数组,JSON数组采用的是JavaScript数组字面量形式:
var values=[25,"hi",true];
而在JSON中,可以采用同样的语法表示一个数组
[25,"hi",true]
解析与序列化
JSON对象有两个方法:stringify()和parse(),在最简单的情况下,这两个对象分别用于把JavaScript对象序列化为JSON字符串,和把JSON字符串解析成JavaScript值.例如:
var book={
title:"json",
authors:[
"su"
],
edition:3,
year:2019
};
//序列化
var jsonText=JSON.stringify(book);
//解析
var bookCopy=JSON.parse(jsonText);
序列化选项
实践上,JSON.stringify()除了要序列化的对像外,还可以接收两个参数,这两个参数用于指定以不同的方式序列化JavaScript对象.第一个参数是过滤器.可以是一个数组也可以是一个函数,第二个参数是一个选项,表示是否在JSON字符串中保留缩进.
过滤器
- 如果过滤器是一个数组,那么JSON.stringify()的结果将只包含数组中列出的结果.
- 如果第二个参数是函数,行为会稍微不同,传入的函数接收两个参数,属性名和属性值.根据属性名可以知道如何处理要序列化的对象的属性.属性名只能是字符串.而在值并非是键值对结构的值时,可以是空字符串.为了改变要序列化对象的结果,函数返回的值就是相应键的值,如果返回了undefined,那么属性会被忽略(删除).
字符缩进
JSON.stringify()的第三个参数用于控制结果中的缩进和空白符,如果参数表示为一个数值,那么它比表示的是每个级别缩进的空格数,例如缩进四个空格:
var jsonText=JSON.stringify(book,null,4);
只要传入有效的控制缩进的参数量(小于等于10),结果字符串中就会包含换行符.
如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符串,其参量也是小于等于10,大于10的将自动读取前10位.
解析选项
JSON.parse()方法也可以接收一个参数,该参数是一个函数,将在每个键值对上调用,此函数被称为还原函数
如果还原函数返回undefined,则表示要从结果中删除对应的键,如果返回其他值,则将该值插入到结果中.
toJOSN()方法
有时候,JSON.stringify()不能满足对某些对象进行自定义序列化的需求,在这些情况下,可以给对象定义toJSON()方法.返回其自身的JSON数据格式.
实例解析:
var book={
"title":"javascript",
"authors":"english man",
"edition":3,
"year":2011
};
var jsonText=JSON.stringify(book,["title","year"],"- -");
console.log(jsonText);
console.log("----------------");
var jsonText1=JSON.stringify(book,function(key,value){
//switch不加break将向下执行
switch(key){
case "title":
return "json";
case "year":
return 2019;
//如果返回undefined,此属性会被删除
case "edition":
return undefined;
default:
return value;
}
//此函数并不会在每个键值对上调用,如歌写成此格式,那么将会显示 undefined
/*if (key=="title") {
return "json";
}else if (key=="year") {
return 9102;
}*/
},2);
//设置了字符串缩进后,将不能使用parse()的还原函数,显示为语法错误,字符异常
console.log(jsonText1);
var jsonText2=JSON.stringify(book);
var bookCopy=JSON.parse(jsonText1,function(key,value){
if (key=="title") {
return "JSON";
}else{
return value;
}
});
console.log(bookCopy);
console.log("----------------")
var book1={
"title":"javascript",
"authors":"english man",
"edition":3,
"year":2011,
toJSON:function(){
return this.title;
}
};
var jsonText3=JSON.stringify(book1);
console.log(jsonText3);
结果: