• 小谈一下JavaScript中的JSON


    一、JSON的语法可以表示以下三种类型的值:

    1、简单值:字符串,数值,布尔值,null
    比如:5,"你好",false,null
    JSON中字符串必须用双引号,而JS中则没有强制规定。
    2、对象
    比如:
    1 {
    2     "name":"蔡斌",
    3     "age":21,
    4     "isRich":false,
    5     "school":{
    6               "name":"广东工业大学",
    7               "location":"广州市大学城"
    8       }
    9 }
    需要注意的是,属性值必须要加双引号。
    3、数组
    比如:
    1 [23,"i",false];

    1 [
    2     {
    3         "name":"蔡斌"
    4     },
    5     {
    6         "name":"张三"
    7     }
    8 ]
     
    二、序列化与解析
    1、将JS对象序列化成JSON对象  JSON.stringify():
    比如:
    1 var person = {
    2     name:"蔡斌",
    3     age:21,
    4     school:“广东工业大学”
    5 }
    6 
    7 var personJson = JSON.stringify(person);
    结果如下:
    1 {"name":"蔡斌","age":21,"school":"广东工业大学"}
    2 //typeof personJson;
    3 //String
    注意:序列化JS对象时,所有函数(除了等下要说到的toJSON()方法以外),原型成员都会被忽略,所有值为undefined的属性也会被忽略。
    例如:
    1 var person = {
    2     name:"蔡斌",
    3     age:21,
    4     school:“广东工业大学”.
    5     phone:undefined,
    6     sayHi:function(){
    7         alert("hi, i am caibin");
    8     }
    9 }
    1 console.log(JSON.stringify(person));
    结果如下
    1 {"name":"蔡斌","age":21,"school":"广东工业大学"}
     
    序列化函数的参数,可以有另外两个可选的参数,这其中,第一个参数是过滤器,可以是一个数组,表示需要留下的属性,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进,这个选项可以是数字,比如:3,也可以是字符串,但是数字最大只能为10,(超过10当做10),字符串长度最多为10(超过10当做10)。
    比如:
     
    当第一个参数是数组时,返回要保留的属性:
    1 var caibinsname = JSON.stringify(person,["name"]);
    结果:
    {"name":"蔡斌"}
     
    当第一个参数是一个函数时,它有两个参数key,value,分别对应JS对象的属性名和属性值
     1 var caibin = JSON.stringify(person,function(key,value){
     2     switch(key){
     3         case "name":
     4             return "caibin";
     5         case "age":
     6             return value + 1;
     7         case "school":
     8             return value;
     9         default:
    10             return value;
    11     }
    12 });
    结果如下:
    {"name":"caibin","age":22,"school":"广东工业大学"}
    名字被改成了英文的,然后年龄也增加了1
     
    接下来是可选参数的第二个参数
    当第二个参数是数字时:
    var caibinsname = JSON.stringify(person,["name","age"],4);
    结果:其中每个属性前面缩进了4个空格
    1 {
    2     "name": "蔡斌",
    3     "age": 21
    4 } 

    再如:

    1 var caibinsname = JSON.stringify(person,["name","age"],"**");
    结果如下:
    1 {
    2 **"name": "蔡斌",
    3 **"age": 21
    4 }
     
    第一个参数不用时,需要将其设置为null:
    var caibinsname = JSON.stringify(person,null,4);
     
    toJSON()方法:
    当JSON.stringify()方法不能满足对某些对象的序列化要求时,可以给对象增加一个自定义的方法。
    原生的Date对象有一个toJSON方法,可以将其转换成IS0 8601日期字符串(这和在Date对象上调用.toISOString()方法返回的结果一致)
    比如:
    1 var newDate = new Date();
    2 JSON.stringify(newDate);
    结果如下:
    "2014-07-29T16:11:27.340Z"
     
    我们可以为任何对象添加toJSON方法:
    1 var book = {
    2     title:"JavaScript权威指南",
    3     edition:6,
    4     toJSON:function(){
    5         return "《"+this.title + " 第六版》"
    6     }
    7 };
    8 JSON.stringify(book);
    结果如下:
    "《JavaScript权威指南 第六版》"
     
    小结下:
    假设把一个对象Object传递给JSON.stringify(),序列化Object的顺序如下:
    a、如果存在toJSON()方法,则调用toJSON()方法,否则返回该对象本身。
    b、如果可选的参数中,第一个参数是过滤器,则应用这个过滤器,并且将a中的返回值传递给这个过滤器
    c、对于b中返回的每个值进行序列化
    d、如果可选的参数中,第二个参数存在,那么执行相应的格式化操作。
     
     
    2、将JSON字符串解析成JS对象
    //personjson : {"name":"蔡斌","age":21,"school":"广东工业大学"}
     
    1 var caibin = JSON.parse(personjson);
    结果如下:
    Object {name: "蔡斌", age: 21, school: "广东工业大学"}
    typeof caibin;
    //object
     
    JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。这个函数通常被称作还原函数。
    比如:
    1 var caibin = JSON.parse(personjson,function(key,value){
    2     if(key == "name"){
    3         return "caibin";
    4     }
    5     return value;
    6 });
    结果如下:
    Object{name: "caibin", age: 21, school: "广东工业大学"}
    原来的"name":”蔡斌“ 已经被还原成 name:"caibin"
     
    通常将日期字符串转换成Data对象时,要用到还原函数:
     1 var book = {
     2     "title":"JavaScript高级程序设计",
     3     edition:3,
     4     releaseDate:new Date(2011,11,1)
     5 }
     6 var bookJson = JSON.stringify(book);
     7 
     8 var bookcopy = JSON.parse(bookJson,function(key,value){
     9     if(key == "releaseDate"){
    10         return new Date(value);
    11     }
    12     return value;
    13 });
    结果bookcopy的值如下(chrome控制台打印):
     
    Object {title"JavaScript高级程序设计"edition3releaseDateThu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间)}





  • 相关阅读:
    C# 如何得到局域网中的计算机名?
    设计模式之Factory(转帖)[学习用]
    byte类型特殊的地方
    原码、反码和补码
    由Public key生成Public key token
    .Net位运算符&,|,!,^,<<,>>
    强命名程序集,签名,延迟签名
    把16进制字符转换成byte数组
    SHA1哈希算法
    .NET工具篇(四)—SN.EXE
  • 原文地址:https://www.cnblogs.com/iceseal/p/3876829.html
Copyright © 2020-2023  润新知