JSON(一种数据格式)
1、要点
(1)键名必须加双引号
(2)属性值只能是数值(10进制)、字符串(双引号)、布尔值、null、对象
(3)最后一个属性后面不能有逗号
(4)可以跨平台数据传输,速度快
2、语法(JSON的语法可以表示三种类型的值)
(1)简单值:可以在JSON中表示字符串(必须使用双引号)、数值、布尔值和null;但不支持JavaScript中的特殊值undefined。
(2)对象:对象的属性必须加双引号。
{
"name": "liang",
"age": 26,
"married": false,
"address": null
}
(3)数组:["ligang", 25, false, null]
3、JSON.stringfy()
JSON.stringfy(“JavaScript对象”, “过滤器”, “是否缩进”):把一个JavaScript对象序列化为一个JSON字符串;值为undefined的属性会被跳过。
示例:undefined会被忽略
var person = {
name: "liang",
age: 26,
address: undefined
}
JSON.stringify(person); // "{"name":"liang","age":26}"
(1)第二个参数是一个数组,返回只包含name和age
JSON.stringify(ary, ["name", "age"]);
// 结果:"[{"name":"ligang","age":26},{"name":"camile","age":26}]"
(2)第二个参数是一个函数
JSON.stringify(ary, function(key, value) {
switch(key) {
case "name":
return value;
case "age":
return undefined;
case "sex":
return value === "male" ? "男" : "女";
default:
return value;
}
});
// 结果:"[{"name":"ligang","sex":"男"},{"name":"camile","sex":"女"}]"
注意:如果函数返回了undefined,那么相应的属性会被忽略
(3)第三个参数控制结果中的缩进和空白符。
如果是一个数值,那他表示的是每个级别缩进的空格数;最大缩进空格数为10,大于10的自动转化为10。
如果是非数值,则这个字符将在JSON字符串中被用作缩进符(不再使用空格)。
var person = {
name: "ligang",
address: {
province: "shandong",
city: "yantai"
}
};
JSON.stringify(person, null, 4);
// 结果:
{
"name": "ligang",
"address": {
"province": "shandong",
"city": "yantai"
}
}"
JSON.stringify(person, null, "--");
// 结果:
"{
--"name": "ligang",
--"address": {
----"province": "shandong",
----"city": "yantai"
--}
}"
(4)toJSON()方法,自定义序列化需求
var person = {
name: "ligang",
age: 26,
toJSON: function() {
return this.name + "|" + this.age;
}
};
JSON.stringify(person);
// 结果:""ligang|26""
把一个对象传入JSON.stringify(),序列化该对象的顺序如下:
- 如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
- 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
- 对第(2)步返回的每个值进行相应的序列化。
- 如果提供了第三个参数,执行相应的格式化。
var person = {
firstName: "li",
lastName: "gang",
age: 26,
toJSON: function() {
return {name: this.firstName + this.lastName, age: this.age};
}
};
JSON.stringify(person, function(key, value){
switch(key){
case "age":
return undefined;
default:
return value;
}
}, "--");
// 结果:
"{
--"name": "ligang"
}"
(5)序列化数值,精度丢失
JSON.stringify({id:14812712740571735}); // "{"id":14812712740571736}"
根据国际标准IEEE 754,64位浮点数格式的64个二进制位中,第0位到第51位储存有效数字部分,第52到第62位储存指数部分,第63位是符号位,0表示正数,1表示负数。因此,JavaScript提供的有效数字的精度为53个二进制位(IEEE 754规定有效数字第一位默认为1,再加上后面的52位),也就是说,绝对值小于2的53次方的整数,即-(Math.pow(2, 53)-1)
到Math.pow(2, 53)-1
,都可以精确表示。即16位数!
转成字符串可以解决这个问题!!!
JSON.stringify({id:"14812712740571735"}); // "{"id":"14812712740571735"}"