• jacascript JSON对象的学习


    前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!

      JSON (javascript object notation) 全称是 javascript 对象表示法,它是一种数据交换的文本格式,而不是一种编程语言,用于读取结构化数据。2001年由Douglas Crockford提出,目的是取代繁琐笨重的 XML 格式。正确的 JSON 格式需要符合一定的语法规则,使用 www.json.cn 网站可以对 JSON 进行格式校验;

    语法规则

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

    简单值

      简单值使用与 javascript 相同的语法,可以在 JSON 中表示字符串、数值、布尔值和 null;JSON 不支持 javascript 中的特殊值 undefined

      字符串必须使用双引号表示,不能使用单引号。数值必须以十进制表示,且不能使用 NaN 和 Infinity;

    对象

      对象作为一种复杂数据类型,表示的是一组有序的键值对。而每个键值对中的值可以是简单值,也可以是复杂数据类型的值;

      与 javascript 的对象字面量相比,JSON 有三个不同的地方:

    1. JSON 没有变量的概念
    2. JSON 中,对象的键名必须放在双引号里面
    3. 因为 JSON 不是 javascript 语句,所以没有末尾的分号

      同一个对象中不应该出现两个同名属性

    数组

      数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组

      JSON 数组也没有变量和分号,把数组和对象结合起来,可以构成更复杂的数据集合

      数组或对象最后一个成员的后面,不能加逗号

    JSON对象

      JSON 之所以流行,是因为可以把 JSON 数据结构解析为有用的 javascript 对象;

      ECMAScript5 对解析 JSON 的行为进行了规范,定义了全局对象 JSON;IE7及以下浏览器不支持

      JSON 对象有两个方法:stringify() 和 parse()。这两个方法分别用于把 JavaScript 对象序列化为 JSON 字符串和把 JSON 字符串解析为原生 JavaScript 值;

    JSON.stringify()

      JSON.stringify() 方法用于将一个JavaScript 值转为 JSON 字符串。该字符串应该符合 JSON 格式,并且可以被 JSON.parse() 方法还原; 

      默认情况下,JSON.stringify() 输出的 JSON 字符串不包括任何空格字符或缩进

      JSON.stringify() 方法会忽略对象的不可遍历属性;

            <script type="text/javascript">
                var mate = {
                    "title":"javascript",
                    "person":{
                        "name":"jack",
                        "age":"18"
                    }
                };
                
                console.log(JSON.stringify(mate));//{"title":"javascript","person":{"name":"jack","age":"18"}}
                console.log(JSON.stringify(new Date()));//"2017-09-25T10:50:42.362Z"
            </script>

      

      JSON.stringify() 除了要序列化的 javascript 对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化 javascript 对象。第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在 JSON 字符串中保留缩进

      当 JSON.stringify() 方法的第二个参数是一个数组时,这时相当于实现一个过滤器的功能;过滤器只对对象的第一层属性有效;

      过滤器对数组无效;

            <script type="text/javascript">
                var mate = {
                    "title":"javascript",
                    "person":{
                        "name":"jack",
                        "age":"18"
                    }
                };
                
                console.log(JSON.stringify(mate,['bbb','person','aaaaaa','age']));//{"person":{"age":"18"}}
                //当 JSON.stringify() 方法的第二个参数是一个数组时,这时相当于实现一个过滤器的功能;过滤器只对对象的第一层属性有效;
                
                var arr = ["a","b"];
                console.log(JSON.stringify(arr,["c"]));//["a","b"]
                //过滤器对数组无效
            </script>

      JSON.stringify() 方法的第二个参数也可以是一个函数。传入的函数接收两个参数,属性(键)名和属性值;

      属性(键)名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串;

      这个函数参数会递归处理所有的键;

            <script type="text/javascript">
                var data = {
                    "title":"javascript",
                    "person":{
                        "name":"jack",
                        "age":"18",
                        a:{
                            bbb:1111
                        }
                    }
                };
                
                //属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串
                //这个函数参数会递归处理所有的键
                JSON.stringify(data,function(key,value){
                    console.log("["+ key + "]:" + value);
                    return value;
                })
                // []:[object Object]   第一次键名为空,键值是整个对象
                // [title]:javascript
                // [person]:[object Object]
                // [name]:jack
                // [age]:18
                // [a]:[object Object]
                // [bbb]:1111
            </script>

      函数返回的值就是相应键的值。如果函数返回了undefined或没有返回值,那么相应的属性会被忽略;

            <script type="text/javascript">
                var data = {
                    "title":"javascript",
                    "person":{
                        "name":"jack",
                        "age":"18",
                        a:{
                            bbb:1111
                        }
                    }
                };
                
                //函数返回的值就是相应键的值。如果函数返回了undefined或没有返回值,那么相应的属性会被忽略
                JSON.stringify(data,function(key,value){
                    if(typeof(value) === "string"){
                        return undefined;
                    }
                    console.log("["+ key + "]:" + value);
                    return value;
                })
                // []:[object Object]
                // [person]:[object Object]
                // [a]:[object Object]
                // [bbb]:1111
            </script>

      

      JSON.stringify() 方法还可以接受第三个参数,表示数据之间的缩进(默认为0),用于增加返回的 JSON 字符串的可读性;

      如果是数字,表示每个属性前面添加的空格(最多不超过10个),一个 tab 是4个空格,所以一般写2或者4;

      如果是字符串(不超过10个字符),则该字符串会添加在每行前面;

            <script type="text/javascript">
                var data = {
                    "title":"javascript",
                    "person":{
                        "name":"jack",
                        "age":"18",
                        a:{
                            bbb:1111
                        }
                    }
                };
                
                console.log(JSON.stringify(data,null,'数据'));
                //{
                //数据"title": "javascript",
                //数据"person": {
                //数据数据"name": "jack",
                //数据数据"age": "18",
                //数据数据"a": {
                //数据数据数据"bbb": 1111
                //数据数据}
                //数据}
                //}
            </script>

    JSON.parse()

      JSON.parse() 方法用于将 JSON 字符串转化成 javascript 对象;前端获取 JSON 数据后,要先用它转化后才能操作数据

      如果传入的字符串不是有效的 JSON 格式,JSON.parse方法将报错;

      JSON.parse() 方法也可以接收一个函数参数,在每个键值对上调用,这个函数被称为还原函数(reviver)。该函数接收两个参数,一个键和一个值,返回一个值;

      如果还原函数返回 undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中;

            <script type="text/javascript">
                var test = JSON.parse('{"title":"javascript","person":{"name":"Shane","age":"18"}}',function(key,value){
                    if (key === ''){
                        return value
                    }else if(key === 'person'){
                        return value;
                    }
                    return value;
                });
                
                console.log(test.person.name);//Shane
            </script>

      在将日期字符串转换为Date对象时,经常要用到还原函数

            <script type="text/javascript">
                var person = {
                    "name": "Shane",
                    "date": new Date(2017,10,10)
                }
                var jsonData = JSON.stringify(person);
                
                var bookCopy = JSON.parse(jsonData,function(key,value){
                    if(key == 'date'){
                        return new Date(value);
                    }
                    return value;
                })
                console.log(bookCopy.date.getMonth());//10
            </script>
  • 相关阅读:
    【poj1733】 Parity game
    【poj1018】 Communication System
    【poj1017】 Packets
    【poj1568】 Find the Winning Move
    【poj1085】 Triangle War
    【bzoj1082】 SCOI2005—栅栏
    【codevs1086】 栈
    【bzoj3240】 Noi2013—矩阵游戏
    【bzoj1951】 Sdoi2010—古代猪文
    中国剩余定理学习笔记
  • 原文地址:https://www.cnblogs.com/sspeng/p/7593536.html
Copyright © 2020-2023  润新知