json

json是一种轻量级的数据格式,它不是编程语言,更不从属于JavaScriopt。

json用法

1.与JavaScriopt不同的是,json字符串必须使用双引号,否则会报错;
2.json的对象中的属性需要用引号包裹;
3.json不需要声明变量,因为json并不支持变量;
4.json的对象中,键值对与键值对之间用逗号分隔,而不是分号。

数据类型

json可支持三种数据类型:

  • 简单值:字符串类型、数字类型、布尔值、null;
  • 数组:数组可以通过值的索引来访问值。数组的值可以是任意类型(简单值、数组或对象);
  • 对象:对象由键值对构成,每个键值对的值可以是任意类型(简单值、数组或对象)。
    注:json不支持undefined、变量、函数或对象实例

序列化与解析

json对象有两个方法:stringify ( )与parse ( ) 。stringify ( )用于将js对象序列化为json字符串,而parse ( ) 用于将json字符串解析为js值
举个例子:

var book = {
    title : "Professional JavaScriopt",
    authors : ["Nicholas C. Zakas"],
    edition : 3,
    year : 2011
};
var jsonText = JSON.stringify (book);

var bookCopy = JSON.parse (jsonText);

上例中,虽然book与bookCopy 具有相同的值,但它们两个是彼此独立的对象。

JSON.stringify ( )

JSON.stringify ( )方法可接收三个参数:

  • 需要序列化的js对象;
  • 过滤器,可以是数组或函数;
  • 用于序列化为json字符串时的缩进(默认情况下,JSON.stringify ( )输出的字符串不包括任何空字符串或缩进 )。

第二个参数为数组

举个例子:

var book = {
    title : "Professional JavaScriopt",
    aurhors : ["Nicholas C. Zakas"],
    edition : 3,
    year : 2011
};
var jsonText = JSON.stringify (book , ["authors" , "year"]);

第二个参数为函数

当stringify ( )方法的第二个参数传入的是一个函数时,该函数会接收两个参数:属性名(键名)、属性值,并返回一个值。
注:若某个键值对的值是undefined,则该属性将会被忽略,不会被序列化。
举个栗子:

var book = {
    title : "Professional JavaScriopt",
    aurhors : ["Nicholas C. Zakas"],
    edition : 3,
    year : 2011
};
var jsonText = JSON.stringify (book ,function(key , value){
    switch(key){
        case "authors" : 
            return value.join(",");
        case "year" : 
            return 5000;
        case "edition " : 
            return undefined;
        default : 
            return value;
    }
});

第三个参数

该参数用于控制json字符串中的缩进和空白符。

  • 若参数是一个小于等于10的数字(最大缩进空格数为10,大于10的值将会被自动转换为10),则表示每级缩进的空格数;
  • 若参数是一个字符串、制表符等的非数值,则该字符串、制表符等将被用作缩进符,同样,字符串等不能超过10个字符。

toJSON ( )方法

举个栗子:

var book = {
            title : "Professional JavaScriopt",
            aurhors : ["Nicholas C. Zakas"],
            edition : 3,
            year : 2011,
            toJSON:function(){
                return this.title;
            }
}; 
var jsonText = JSON.stringify (book);

序列化的顺序

当把一个js对象传入JSON.stringify ( )时,序列化该对象的顺序则是:
1.若存在toJSON ( )方法且能取得有效值,则调用该方法。否则,返回对象本身;例如:

var book = {
    title : "Professional JavaScriopt",
    authors : ["Nicholas C. Zakas"],
    edition : 3,
    year : 2011
};
var jsonText = JSON.stringify (book);

2.如果提供了第二个参数,则应用该过滤器。注:传入过滤器的值是第1步返回的值

3.对第2步返回的每个值进行相应的序列化。
4.如果提供了第三个参数,则执行。

JSON.parse ( )

JSON.parse ( )可以接收两个参数:

  • 需要解析的json字符串;
  • 还原函数;
    还原函数同过滤函数一样,可以接收两个参数:key、value,并返回一个值。若返回的是undefined,则表示要从结果中删除相对应的键
    举个栗子:
var book = {
    title : "Professional JavaScriopt",
    authors : ["Nicholas C. Zakas"],
    edition : 3,
    year : 2011,
    releaseDate : new Date(2018,12,12)
};
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());

你可能感兴趣的:(json)