JSON(Java Script Object Notation)使用JavaScript语法,是用于存储和传输数据的格式,通常用于服务端向网页传递数据。JSON格式仅仅是一个文本,文本可以被任何编程语言读取及作为数据格式传递(一种类似js中的对象格式的字符串,json它是一个字符串,只不过长的像对象)从上面的描述中我们可以看到如下知识

  JSON的规则:数据放在了一对引号当中,用{}或者是[]括起来;里面的每一个数据都是以键值对表示(key:value);key必须放双引号,单引号不行:每个数据之间用逗号隔开.

  JSON的用途:用于js与后端进行数据的交互

  JSON属性值:只能是10进制数值,字符串(双引号),布尔值和null,数组,符合JSON要求的对象(言外之意是不能为函数,NaN,+(-)Infinity和undefined)。

<script>
    //json的数组格式
    var arr = ['davina', 'amy', 'lisa']; //存储字符串的数组
    console.log(arr[2]);//lisa

    var arr1 = [arr,
        {
            "name": "dvaina",
            "age": 18
        },
        {
            "name": "lisa",
            "age": 20
        }]
    console.log(typeof arr1, arr1[2].name); //object lisa
</script>

  JSON对象的方法:stringify()和parse().

  JSON.stringify()方法将一个对象转成JSON格式的字符串,如果对象中的key没有加引号,也是可以转换的,转换后的结果会自动给它加上引号。

  一个参数的情况:

<script>

    var obj1 = [1, 2, 3];
    var obj2 = { "name": 'dvaina', "age": '20' };
    var obj3 = { name: 'lisa', "age": '20' };
    console.log(JSON.stringify(obj1));  //[1,2,3]
    console.log(JSON.stringify(obj2)); //{"name":"dvaina","age":"20"}
    console.log(JSON.stringify(obj3)); //{"name":"lisa","age":"20"}

    //stringify()方法把数学对象转换成字对象的字符串形式
    console.log(JSON.stringify(Math)); //{}
    console.log(JSON.stringify(new Boolean(true))); //true
    //stringify()方法把日期对象转换成字符串
    console.log(JSON.stringify(new Date())); //"2019-12-09T06:22:34.685Z"

    //转换中,如果对象成员是undefined或函数,成员会忽略
    //如果数组的成员是undefined或者函数,则值会转成null
    obj4 = {
        a: function () { },
        b: undefined,
        c: [function () { }, undefined],
    }
    console.log(JSON.stringify(obj4)); //{"c":[null,null]}
</script>

  第二个参数也可以是一个函数或数组

<script>
        //如果第二个参数是函数,序列化过程中的每个属性都会被这个函数转化和处理
        var str = {
            "name": "davina",
            "age": 18,
            "phone": 11111111
        }
        var jsonStr = JSON.stringify(str, function (key, value) {
            if (key == "phone") {
                return "(0713)" + value;
            } else if (typeof value === "age") {
                return value + 2;
            } else {
                return value;
            }
        })
        console.log(jsonStr)  //{"name":"davina","age":18,"phone":"(0713)11111111"}
        //如果是数组,那只有包含在这个数组中的属性才会被序列化到json字符串中
        var str1 = {
            "name": "davina",
            "age": 18,
            "phone": 11111111
        }
        var jsonStr1=JSON.stringify(str1,["name","age","phone","address"]);
        console.log(jsonStr1); //{"name":"davina","age":18,"phone":11111111}
     //如果是null,那和空一样
    </script>

  第三个参数用于美化输出——

  JSON.parse()将字符串转化成对象,如果传入的不是有效JSON格式,会报错。JSON.parse()也可以接收一个函数参数,在每个键值对上调用,这个函数被称为还原函数,该函数接收两个参数,一个键和一个值。如果还原函数返回undefined,那就要从结果中删除相应的键,如果返回其它值,则将值插入到结果中。

<script>
        console.log(JSON.parse('{}'));  //{}
        console.log(JSON.parse('true'));  //true
        var o = JSON.parse('{"name":"davina"}');
        console.log(o.name); //dvaina
        //JSON.parse()也可以接收一个函数参数,在每一个键值对调用,这个函数被称为还原函数,这个函数接收两个参数,一个键和一个值,返回一个值

        var book = {
            "name": "js",
            "date": new Date(2019, 9, 1)
        }
        var jsonStr = JSON.stringify(book);
        
        console.log(jsonStr)//{"name":"js","date":"2019-09-30T16:00:00.000Z"}

        var bookName = JSON.parse(jsonStr, function (key, value) {
            if (key == 'date') {
                return new Date(value);
            }
            return value;
        })
        console.log(bookName.date.getFullYear());//2019
    </script>

  eval()类似于JSON.parse()方法,可以将json字符串转换成json对象,但是它也可以执行不符合json格式的代码,所以尽量少用或不用。