JSON数据格式

JSON

前言

经常需要接触接口的json文件,所以做一个笔记来了解一下json。

语法

JSON的语法可以表示下列3种类型的值:
* 简单值
* 对象
* 数组
不支持变量,函数和对象实例,具体怎么表示上面3种值,分节讲解。

1.简单值

最简单的json数据可以直接传数字,字符串等:

1
"hello"

不过字符串只限于双引号标识,不能用js中的单引号。

2.对象

与js中的对象相比有几个区别:
* 不需要声明对象名
* 末尾没有冒号
* 对象的属性必须加双引号

//js
var person = {
    name: "Nicholas",
    age: 29
};
//json
{
"name": "Nicholas",
"age": 29
}
3.数组

json数组也没有变量和分号。

//js
var values = [25, "hi", true];

//json
[25, "hi", true]

//较为复杂的json数据结构
[
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
},
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 2,
year: 2009
},
{
"title": "Professional Ajax",
"authors": [
"Nicholas C. Zakas",
"Jeremy McPeak",
"Joe Fawcett"
],
edition: 2,
year: 2008
},
{
"title": "Professional Ajax",
"authors": [
"Nicholas C. Zakas",
"Jeremy McPeak",
"Joe Fawcett"
],
edition: 1,
year: 2007
}]

解析与序列化

json数据可以解析成有用的js对象,js对象也可以序列化成json数据格式。

1.json对象

stringify

把js对象序列化成json数据格式

var book = {
    title: "Professional JavaScript",
    authors: [
    "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011
};
var jsonText = JSON.stringify(book);
//{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3,"year":2011}

parse

把json数据解析成有用的js对象

var bookCopy = JSON.parse(jsonText);

传递错误的json数据会报错

2.序列化选项

JSON.stringify还可以另外两个参数,用于指定序列化的方式:
* 参数一:过滤器,可以是数组,也可以是函数
* 参数二: 选项,表示在json字符中保留缩进

过滤器

只返回要求序列化的属性:
数组形式

var book = {
    "title": "Professional JavaScript",
    "authors": [
    "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011
};
var jsonText = JSON.stringify(book, ["title", "edition"]);
//{"title":"Professional JavaScript","edition":3}

函数形式:
对相应属性进行操作

var book = {
    "title": "Professional JavaScript",
    "authors": [
    "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011
    };
    var jsonText = JSON.stringify(book, function(key, value){
    switch(key){
        case "authors":
            return value.join(",")
        case "year":
            return 5000;
        case "edition":
            return undefined;
        default:
            return value;
    }
});
//{"title":"Professional JavaScript","authors":"Nicholas C. Zakas","year":5000}

字符串缩进

JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数
值,那它表示的是每个级别缩进的空格数。如果缩进参数是一个字符串而非数值,则这个字符串将在 JSON 字符串中被用作缩进字符(不再使用空格)。在使用字符串的情况下,可以将缩进字符设置为制表符,或者两个短划线之类的任意字符。

toJSON()方法
有时候, JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。在这些情况下,可以给对象定义 toJSON()方法,返回其自身的 JSON 数据格式。原生 Date 对象有一个 toJSON()方法,能够将 JavaScript的 Date 对象自动转换成 ISO 8601日期字符串(与在 Date 对象上调用 toISOString()的结果完全一样)。
可以为任何对象添加 toJSON()方法,比如:

var book = {
    "title": "Professional JavaScript",
    "authors": [
    "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011,
    toJSON: function(){    
        return this.title;
    }
};
var jsonText = JSON.stringify(book);
//Professional JavaScript
3.解析选项

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。

var book = {
    "title": "Professional JavaScript",
    "authors": [
    "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011,
    releaseDate: new Date(2011, 11, 1)
};
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText, function(key, value){
    if (key == "releaseDate"){
        return new Date(value);
    } else {
        return value;
    }
});
alert(bookCopy.releaseDate.getFullYear());

以上代码先是为 book 对象新增了一个 releaseDate 属性,该属性保存着一个 Date 对象。这个对象在经过序列化之后变成了有效的 JSON 字符串,然后经过解析又在 bookCopy 中还原为一个 Date对象。还原函数在遇到”releaseDate”键时,会基于相应的值创建一个新的 Date 对象。结果就是bookCopy.releaseDate 属性中会保存一个 Date 对象。正因为如此,才能基于这个对象调用getFullYear()方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值