深入理解javascript中的JSON

首先注明写这篇博文的原因是看了一篇文章,比较喜欢博主的风格。

从三个部分聊聊,JSON的定义,js对象和JSON,js中JSON的函数。

1.JSON的定义

官网给出的解释是:一种轻量级的数据交换格式。相比于xml格式,占据更小的宽带。
<person><name>二百六</name><height>160</height><weight>60</weight></person>
{"name":"二百六","height":160,"weight":60}
JSON基于两种结构
“键/值”:key: value,在js中理解为对象,以“{”“}”开头和结束
值的有序列表:数组,以“[”“]”开头和结束
JSON的值
1.可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。//注意没有undefined
2.undefined、任意的函数(除去toJSON函数之外)以及 symbol 值(symbol详见ES6对symbol的介绍)
(1)出现在非数组对象的属性值中:在序列化过程中会被忽略
(2)出现在数组中时:被转换成 null
3.布尔值,数字,字符串会自动转化为对应的原始值。new String('hello') => 'hello',welcome+123 => 'welcome123'。
4.键名不是双引号的(包括没有引号或有单引号),会自动变为双引号,字符串是单引号的,会自动变为双引号。
5.最后一个属性后面有逗号的,会被自动去掉。
var friend={
    firstName: 'Good',
    'lastName': 'Man',
    'address': undefined,
    'phone': ["1234567",undefined],
    'fullName': function(){
        return this.firstName + ' ' + this.lastName;
    },
};
JSON.stringify(friend);
"{"firstName":"Good","lastName":"Man","phone":["1234567",null]}"

另外函数名称变为toJSON:
var info={  
    "msg":"I Love You",
    "toJSON":function(){
        var replaceMsg="Go Die";
        return replaceMsg;
    }
};
JSON.stringify(info);  
""Go Die""

2.js对象和JSON

本质不同的东西,就好比“斑马”和“斑马线”,斑马线是基于斑马命名的;
JSON(JavaScript Object Notation)即Javascript对象符号,JSON的语法是基于js对象的;
斑马线是非生物,好比JSON是一种数据格式;而斑马是活的,js对象是一个实例,存在与内存的一个东西。
JSON是可以传输的,因为它是文本格式,js对象没办法传输;
语法上JSON更为严格。

3.js中JSON的函数

JSON.stringify(value[, replacer [, space]]) 
第一个参数,传入一个JSON格式的js对象或数组,
第二个参数,可以是函数,也可以是数组。若不想设置第二个参数,只想设置第三个参数时,第二个参数设置为null,示例如下:
1.第二个参数为函数时:
var friend={  
    "firstName": "Good",
    "lastName": "Man",
    "phone":"1234567",
    "age":18
};

var friendAfter=JSON.stringify(friend,function(key,value){  
    if(key==="phone")
        return "(000)"+value;
    else if(typeof value === "number")
        return value + 10;
    else
        return value; //如果你把这个else分句删除,那么结果会是undefined
});

console.log(friendAfter);  
//输出:{"firstName":"Good","lastName":"Man","phone":"(000)1234567","age":28}


2.第二个参数为数组时:
var friend={  
    "firstName": "Good",
    "lastName": "Man",
    "phone":"1234567",
    "age":18
};

//注意下面的数组有一个值并不是上面对象的任何一个属性名
var friendAfter=JSON.stringify(friend,["firstName","address","phone"]);

console.log(friendAfter);  
//{"firstName":"Good","phone":"1234567"}
//指定的“address”由于没有在原来的对象中找到而被忽略
第三个参数,用于美化输出——不建议用
取值如果是1-10的数字时,代表几个空格,
字符串时用字符取代空格,最多取前10个字符,
没有提供或为null时,为默认
var friend={  
    "firstName": "Good",
    "lastName": "Man",
    "phone":{"home":"1234567","work":"7654321"}
};
//直接转化是这样的:
//{"firstName":"Good","lastName":"Man","phone":{"home":"1234567","work":"7654321"}}

情况1:
JSON.stringify(friend,null,4);  
输出:
{
    "firstName": "Good",
    "lastName": "Man",
    "phone": {
        "home": "1234567",
        "work": "7654321"
    }
}

情况2:
JSON.stringify(friend,null,"HAHAHAHA");  
输出:
{
HAHAHAHA"firstName": "Good",  
HAHAHAHA"lastName": "Man",  
HAHAHAHA"phone": {  
HAHAHAHAHAHAHAHA"home": "1234567",  
HAHAHAHAHAHAHAHA"work": "7654321"  
HAHAHAHA}  
}

  

  

  

  

  

  

  

  

posted @ 2017-03-29 18:43  简惬  阅读(363)  评论(0编辑  收藏  举报