JSON

JSON

JSON(JavaScript Object Notation, JS对象标记)是一种数据格式,不是一种编程语言。JSON和JavaScript对象区别,就像“斑马线”和“斑马”,“斑马线”基于“斑马”身上的条纹来呈现和命名,但是“斑马”和“斑马线”是两种东西。不要混淆!

一、语法

JSON的语法可以表示三种类型的值:
(1)简单值:可以在JSON中表示字符串(必须使用双引号)、数值、布尔值和null;但不支持JavaScript中的特殊值undefined。
(2)对象:对象的属性必须加双引号。

{
    "name": "liang",
    "age": 26"married": false,
    "address": null
}

(3)数组:[“ligang”, 25, false, null]

二、解析和序列化

早期JSON解析器基本上就是使用JavaScript的eval()函数;其存在一定的风险,可能执行一些恶意代码。
对于不能原生支持JSON解析的浏览器,github上提供了比较优秀的shim方法:JSON-js

JSON.stringfy(“JavaScript对象”, “过滤器”, “是否缩进”):把一个JavaScript对象序列化为一个JSON字符串;值为undefined的属性会被跳过。

示例:undefined会被忽略

var person = {
    name: "liang",
    age: 26,
    address: undefined
}
JSON.stringify(person);     // "{"name":"liang","age":26}"

示例:过滤结果

var ary = [
    {name: "ligang", age: 26, sex: "male"},
    {name: "camile", age: 26, sex: "female"}
];

(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"
    }
}"

(4)toJSON()方法,自定义序列化需求

var person = {
    name: "ligang",
    age: 26,
    toJSON: function() {
        return this.name + "|" + this.age;
    }
};
JSON.stringify(person);
// 结果:""ligang|26"" 

三、解析选项

JSON.parse(jsonText, fn),将JSON字符串解析为JavaScript值。fn将在每个键值对上调用。如果函数返回undefined,则要从结果中删除相应的键。

var person = {
    name: "ligang",
    age: 26,
    birthday: new Date(1990, 02, 28)
};
var jsonText = JSON.stringify(person);  // "{"name":"ligang","age":26,"birthday":"1990-03-27T16:00:00.000Z"}"
var jsonObj = JSON.parse(jsonText, function(key, value) {
    if(key === "birthday") {
        return new Date(value);
    }else {
        return value;
    }
});
console.log(jsonObj.birthday.getFullYear());    // 1990 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值