深入理解JSON对象

看了js高级程序设计这本书关于json的讲解,下面我把里面我认为比较重要的知识提炼出来,一方面给帮助自己理解,同时也分享给有需要的朋友

json:是一种数据格式,不是一种编程语言

json的语法可以表示简单值(字符串、数值、布尔值、null)和复杂值(对象和数组)。需要注意的是,json中不支持undefined

json不支持变量、函数、对象实例,它就是一种表示结构化数据的格式

在实际的应用中,json更多的用来保存更复杂的数据结构,而简单值只是整个数据结构中的一部分。

json中的对象与JavaScript字面量的对比

JavaScript对象字面量的写法:

var person = {
  name:"leo",
  age:25
};

json对象的写法

{
 "name":"leo",
  "age":25
}

与JavaScript的对象字面量相比,json对象有两个地方不一样

1、json没有声明变量(json中没有变量的概念)

2、json没有末尾的分号(因为它不是JavaScript语句,所以不需要分号);

还有我们看到JavaScript字面量中的对象的属性可以不加双引号,但json对象的属性必须加双引号

json对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为json字符串和把json字符串解析为原生JavaScript值,看个例子

<script>
    var book = {
        title:"javascript",
        author:[
            "leo"
        ],
        edi:3,
        year:2018
    };
    var jsonT = JSON.stringify(book);
   console.dir(jsonT);
   console.dir(typeof(jsonT));//string
</script>

打印的结果为{"title":"javascript","author":["leo"],"edi":3,"year":2018},并且格式为string

这个例子使用json.stringify()把一个JavaScript对象序列化为一个json字符串,然后将它保存在jsonT中,默认情况下,输出的字符串不包括任何空格字符或缩进,注意:在序列化JavaScript对象时,所有函数及原型成员都会被忽略,不体现在结果中,值为undefined的任何属性也都会被跳过。结果中最终都是值为有效的json数据类型的实例属性

将json字符串直接传递个json.parse(),就可以得到相应的JavaScript值。例

   var book2 = JSON.parse(jsonT);
   console.dir(book2);
   console.dir(Object.prototype.toString.call(book2));//[object Object]

虽然book 和book2具有相同的属性,但他们是两个独立的、没有任何关系的对象

序列化选项:

JSON.stringify(),除了要序列的JavaScript对象外,还可以接收两个参数,第一个参数是过滤器,可以是一个数组也可以是一个函数;第二个参数是一个选项,表示是否在json字符串中保留缩进。为了改变序列化对象的结果,函数返回值就是相应键的值。不过要注意,如果函数返回了undefined,那么相应的属性会被忽略。

例1:

<script>
    var book = {
        title:"javascript",
        author:[
            "leo"
        ],
        edi:3,
        year:2018,
        hanshu:function(){},
        weidingyi:undefined
    };
    var jsonT = JSON.stringify(book,["title","edi"]);
   console.dir(jsonT);//{"title":"javascript","edi":3}
</script>

从打印结果可知,当过滤器参数是数组时,那么JSON.stringify()的结果中将只包含数组中列出的属性

例2:
    var book = {
        title:"javascript",
        author:[
            "leo","momo","peng"
        ],
        edi:3,
        year:2018,
        hanshu:function(){},
        weidingyi:undefined
    };
    var jsonT = JSON.stringify(book,function(key,value){
       switch(key){
           case "author":
               return value.join(",");
           case "edi":
               return undefined;
           case "year":
               return 5000;
           default:
               return value;
       }
    });
   console.dir(jsonT);//{"title":"javascript","author":"leo,momo,peng","year":5000}

如果第二个参数是函数,传入函数接收两个参数,属性名和属性值。根据属性名可以知道应该如何处理要序列化对象中的属性。属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串。注意,如果返回的了undefined,那么相应的属性会被忽略。

一定要提供default项,此时返回传入的值,以便其他值都能正常出现在结果中

JSON.stringify()第三个参数用于控制结果中的缩进和空白符,如果这个参数是个数值,那他表示是每个级别缩进的空格数。例如要在每个级别缩进四个空格,代码是这样的

<script>
    var book = {
        title:"javascript",
        author:[
            "leo","momo","peng"
        ],
        edi:3,
        year:2018,
        hanshu:function(){},
        weidingyi:undefined
    };
    var jsonT = JSON.stringify(book,null,4);
   console.dir(jsonT);/*
     {
    "title": "javascript",
    "author": [
        "leo",
        "momo",
        "peng"
    ],
    "edi": 3,
    "year": 2018
}*/

</script>

从打印的结果可以看出,结果字符串中插入了换行符以提高可读性。只要传入有效的控制缩进的参数值,结果字符串就会包含换行符,最大缩进空格数为10,超过10的值都会自动转换为10.

如果缩进参数是一个字符串而非数值,则这个字符串将在json字符串中被用作缩进字符(不再使用空格),同样缩进字符串的长度不能超过10个字符长,超过只出现前10个字符。


解析选项

JSON.parse()也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用,这个函数叫还原函数,和JSON.stringify()接收的过滤函数一样,都接收两个参数,一个键和一个值,并且都需要返回一个值

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值