JSON

曾经,XML是传输结构化数据的标准。后来JSON出现,干掉了他。就是这么一个cool guy,能不学吗? 〒▽〒

JSON是一种数据格式,不是编程语言。因此,并不是只有JS才使用JSON,JSON只是JS语法的一个子集。

一、JSON的语法

JSON的语法可以表示三种类型的值:简单值、对象和数组。

1、简单值

简单值可以是字符串、数值、布尔值和null,但是JSON不支持undefined。

JS表示字符串可以用单引号,也可以用双引号,但是JSON表示字符串只能用双引号,单引号会导致语法错误。

⊙﹏⊙|||    大佬还挑食,唉,没办法,大佬就得宠着啊  ⊙﹏⊙|||

2、对象

JS中对象的字面量创建法的标准格式是这么写的:

var person={
    name:'Alice',
    age:18
};

但是JSON大佬表示一个对象,他要求,对象的属性必须加上双引号,表示字符串的时候也必须用双引号,同时结束的时候不准有分号

{
    "name":"Alice",
    "age":18
}

好吧,JSON虽然事,但是他有一个好处,就是JSON可以在对象中嵌套对象

{
"name":"Alice",
"age":18,
"shool":{
"name":"一中",
"location":"B612星球"
}
}

3、数组

跟JS的数组表达格式一样,但是,把数组和对象结合起来,就会构成更复杂的数据集合了。

[
    {
        "book":"不想学习",
        "authors":[
            "王大锤","王花花"
        ],
        "year":"2019"
    },
    {
        "book":"偶尔也不想活着",
        "authors":[
            "抑郁","没精神"
        ],
        "year":"2019"
    },
]

二、JSON的解析与序列化

JSON能当大佬的原因是,可以把JSON数据结构解析为有用的JS对象,方法简单。

1、解析

由于JSON是JS语法的一个子集,所以eval()函数就可以解析JSON。

ES5对解析JSON的行为进行了规范,定义了全局对象JSON。该对象有两个方法,stringify()和parse(),前者将JS对象序列化为JSON字符串,后者把JSON字符串解析为原生JS值

stringify在将对象序列化为字符串的时候,会跳过值为undefined的属性。

var books= [
    {
        "book":"不想学习",
        "authors":[
            "王大锤","王花花"
        ],
        "year":"2019"
    },
    {
        "book":"偶尔也不想活着",
        "authors":[
            "抑郁","没精神"
        ],
        "year":"2019"
    },
];
var jsonTxt=JSON.stringify(books);
console.log("jsonTxt-->"+jsonTxt);
//jsonTxt-->[{"book":"不想学习","authors":["王大锤","王花花"],"year":"2019"},{"book":"偶尔也不想活着","authors":["抑郁","没精神"],"year":"2019"}]

parse()方法在把JSON字符串转化为JS值的时候,如果传给JSON.parse()方法的字符串不是有效的JSON,该方法会抛出错误,比如这样:“Unexpected token 单 in JSON at position 0”,这里我故意用单引号包裹一个字符串传给parese()方法,他就给我报错了。

var bookCopy=JSON.parse(jsonTxt);
console.log("bookCopy-->"+bookCopy);//bookCopy-->[object Object],[object Object]

三、JSON的序列化stringify()

JSON.stringify()方法可以接收两个参数。第一个参数是过滤器,它的语法可以是数组,也可是是函数。第二个参数是保留缩进的选项,该参数可以是数据,也可以是字符串,但无论是哪个,都不能超过10.保留缩进选项的作用就是:让对象看起来方便,提高可读性。

(1)过滤器参数为数组

当过滤器参数是数组的时候,则JSON.stringify()对象是筛选出数组中指出的属性。

var books= [
    {
        "book":"不想学习",
        "authors":[
            "王大锤","王花花"
        ],
        "year":"2019"
    },
    {
        "book":"偶尔也不想活着",
        "authors":[
            "抑郁","没精神"
        ],
        "year":"2019"
    },
];
var jsonTxt=JSON.stringify(books,["authors",'year']);
console.log("jsonTxt-->"+jsonTxt);
//jsonTxt-->[{"authors":["王大锤","王花花"],"year":"2019"},{"authors":["抑郁","没精神"],"year":"2019"}]

(2)过滤器参数为函数

过滤器参数为函数时,该函数会接收两个参数,键名和属性值。这个函数叫做过滤函数(repalcer)。

键名只能是字符串,如果值并非键值对儿结构的值,键名可以是空字符串。

键名用来选择如何处理对象中的属性。

该方法可以用来修改属性的值,如果属性值为undefined,会跳过该属性,所以可以用该方法来删除属性。

var jsonTxt=JSON.stringify(books,function(key,value){
    switch(key){        
        case "authors":
        return value.join('&');
        case "year":
        return 5000;//修改了year的值
        case "edition":
        return undefined;//通过设置undifined关键字删除该属性
         default://default项是必须要提供的项目
        return value;
    }
});
console.log("jsonTxt-->"+jsonTxt);
//jsonTxt-->[{"book":"不想学习","authors":"王大锤&王花花","year":5000},{"book":"偶尔也不想活着","authors":"抑郁,没精神","year":5000}]

(3)保留缩进选项为数值

数值不能超过10.超过了就按10来算。

(4)保留缩进选项为字符串

字符串长度不能超过10,超过了就按10来算。对象里面的对象,他前面的字符串长度会累加。

var jsonTxt=JSON.stringify(books,function(key,value){
    switch(key){        
        case "authors":
        return value.join('&');
        case "year":
        return 5000;//修改了year的值
        case "edition":
        return undefined;//通过设置undifined关键字删除该属性
         default://default项是必须要提供的项目
        return value;
    }
},"--");
console.log("jsonTxt-->"+jsonTxt);
jsonTxt-->[
--{
----"book": "不想学习",
----"authors": "王大锤&王花花",
----"year": 5000
--},
--{
----"book": "偶尔也不想活着",
----"authors": "抑郁&没精神",
----"year": 5000
--}
]

对象这样读起来就不是一行了,读起来很方便。

四、解析选项JSON.parse()方法

JSON.parse()方法也可以接收一个参数,该参数是一个函数,在每个键值对儿上调用,这个函数名字叫做还原函数(reviver)。

这个函数也是接收两个参数,一个键,一个值,而且都需要返回一个值。

原文地址:https://www.cnblogs.com/qingshanyici/p/10575081.html