JSON 教程

《JavaScript高级程序设计》读书笔记

语法

JSON 语法支持表示 3 种类型的值。

  • 简单值:字符串、数值、布尔值和 null 可以在 JSON 中出现,就像在 JavaScript 中一样。特殊值 undefined 不可以。
  • 对象:第一种复杂数据类型,对象表示有序键/值对。每个值可以是简单值,也可以是复杂类型。
  • 数组:第二种复杂数据类型,数组表示可以通过数值索引访问的值的有序列表。数组的值可以是任意类型,包括简单值、对象,甚至其他数组。
{
  "title": "Professional JavaScript",
  "school": {
    "name": "Merrimack College",
    "location": "North Andover, MA"
  },
  "authors": [
    "Nicholas C. Zakas",
    "Matt Frisbie"
  ]
}

解析与序列化

  • JSON.stringify(text):把一个 JavaScript 对象序列化为一个 JSON 字符串,会输出不包含空格或缩进的 JSON 字符串
  • JSON.parse(jsonText):接受JSON 字符串,转化为js值

序列化选项

JSON.stringify()方法除了要序列化的对象,还可以接收两个参数。一个是过滤器,可以是数组或函数;另一个是用于缩进结果JSON字符串的选项。

1. 过滤结果

如果是数组:返回包含该数组中列出的对象属性。

let book = {
    title: "Professional JavaScript",
    authors: [
        "Nicholas C. Zakas",
        "Matt Frisbie"
    ],
    edition: 4,
    year: 2017
};
JSON.stringify(book, ["title", "edition"]);
// '{"title":"Professional JavaScript","edition":4}'

如果是函数:提供的函数接收两个参数:属性名( key)和属性值( value)。可以根据这个 key 决定要对相应属性执行什么操作。

JSON.stringify(book, (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,Matt Frisbie","year":5000}'

2. 字符串缩进

第三个参数控制缩进和空格。

如果是数值时,表示每一级缩进的空格数。

JSON.stringify(book, null, 4);

如果是字符串,那么就不是用空格来缩进而是用该字符串。最多10个字符,超出截断。

JSON.stringify(book, null, "--" );
// '{\n--"title": "Professional JavaScript",\n--"authors": [\n----"Nicholas C. Zakas",\n----"Matt Frisbie"\n--],\n--"edition": 4,\n--"year": 2017\n}'

3. toJSON() 方法

自定义JSON 序列化。这个对象会被序列化为简单字符串而非对象。

let book = {
    title: "Professional JavaScript",
    authors: [
        "Nicholas C. Zakas",
        "Matt Frisbie"
    ],
    edition: 4,
    year: 2017,
    toJSON: function() {
        return this.title;
    }
};
JSON.stringify(book);
// '"Professional JavaScript"'

执行JSON.stringify() 如下步骤:

  1. 如果可以获取实际的值,则调用 toJSON()方法获取实际的值,否则使用默认的序列化。
  2. 如果提供了第二个参数,则应用过滤。传入过滤函数的值就是第(1)步返回的值。
  3. 第(2)步返回的每个值都会相应地进行序列化。
  4. 如果提供了第三个参数,则相应地进行缩进。

解析选项

JSON.parse()方法也可以接收一个额外的参数,这个函数会针对每个键/值对都调用一次。也接收两个参数,属性名( key)和属性值( value),另外也需要返回值。如果还原函数返回 undefined,则结果中就会删除相应的键。

let book = {
    title: "Professional JavaScript",
    authors: [
        "Nicholas C. Zakas",
        "Matt Frisbie"
    ],
    edition: 4,
    year: 2017,
    releaseDate: new Date(2017, 11, 1)
};
let jsonText = JSON.stringify(book);
JSON.parse(jsonText,(key, value) => key == "releaseDate" ? new Date(value) : value);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天巨兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值