JSON 介绍

时间:2021-10-11
本文章向大家介绍JSON 介绍,主要包括JSON 介绍使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

JSON

1、是什么?

一种轻量级数据格式——字符串

2、干什么?

用于计算机和网络之间存储和传输数据

3、相关语法⭐

目的:先将JS ”打包“(序列化),再 ”解压“(解析)

  • stringify(): 将JavaScript 序列化为 JSON 字符串

  • parse(): 将 JSON 解析为原生 JavaScript 值

4、序列化选项(过滤或修改流程)

JSON.stringify()

实际上,JSON.stringify()方法另外还可以接收两个参数。(第一个为JS对象)

  • 第二个参数是过滤器,可以是数组或函数

  • 第三个参数是用于缩进结果 JSON 字符串的选项


过滤结果

  1. 如果参数是一个数组,那么 JSON.stringify()返回的结果只会包含该数组中列出的对象 属性。比如:

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

let jsonText = JSON.stringify(book, ["title", "edition"]);
// jsonText为JSON字符串: {"title":"Professional JavaScript","edition":4}
  1. 如果参数是一个函数,返回的值就是相应 key 应该包含的结果。

    提供的函数接收两个参数:属性名(key)和属性值(value),这个 key 始终是字符串,只是在值不属于某个键/值对时会是空字符串。 注意,返回 undefined 会导致属性被忽略。下面看一个例子:

let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017
};
let jsonText = JSON.stringify(book, (key, value) => {
switch(key) {
case "authors":
return value.join(",")
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
});
//最终得到的 JSON 字符串是这样的:
{"title":"Professional JavaScript","authors":"Nicholas C. Zakas,Matt
Frisbie","year":5000}

这个函数基于键进行了过滤:

如果键是"authors",则将数组值转换为字符串;

如果键是"year",则将值设置为 5000;

如果键是"edition",则返回 undefined,即忽略该属性。

字符串缩进

JSON.stringify()方法的第三个参数控制缩进和空格。

在这个参数是数值时,表示每一级缩进的空格数。例如,每级缩进 4 个空格,可以这样:

let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017
};
let jsonText = JSON.stringify(book, null, 4);
这样得到的 jsonText 格式如下:
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas",
"Matt Frisbie"
],
"edition": 4,
"year": 2017
}

如果缩进参数是一个字符串而非数值,那么 JSON 字符串中就会使用这个字符串

使用数值或字符串时有 10 个字符的长度限制

toJSON()方法 (自定义过滤)

有时候,对象需要在 JSON.stringify()之上自定义 JSON 序列化。

事实上,原生 Date 对象就有一个 toJSON()方法,能够自动将 JavaScript 的 Date 对象转换为 ISO 8601 日期字符串(本质上与在Date 对象上调用 toISOString()方法一样)。 下面的对象为自定义序列化而添加了一个 toJSON()方法:

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

这里 book 对象中定义的 toJSON()方法简单地返回了图书的书名(this.title)。与 Date 对象 类似,这个对象会被序列化为简单字符串而非对象。toJSON()方法可以返回任意序列化值,都可以起到相应的作用。

如果对象被嵌入在另一个对象中,返回 undefined 会导致值变成 null;

或者如果是顶级对象,则本身就是 undefined。

注意,箭头函数不能用来定义 toJSON()方法。主要原因是箭头函数的词法作用域是全局作用域,在这种情况下不合适。

toJSON()方法可以与过滤函数一起使用,因此理解不同序列化流程的顺序非常重要。

在把对象传给 JSON.stringify()时会执行如下步骤。 (1) 如果可以获取实际的值,则调用 toJSON()方法获取实际的值,否则使用默认的序列化。 (2) 如果提供了第二个参数,则应用过滤。传入过滤函数的值就是第(1)步返回的值。 (3) 第(2)步返回的每个值都会相应地进行序列化。 (4) 如果提供了第三个参数,则相应地进行缩进。 理解这个顺序有助于决定是创建 toJSON()方法,还是使用过滤函数,抑或是两者都用。

 

5、解析选项(过滤或修改流程)

JSON.parse()

  • 可额外接受参数:函数,该函数被称为还原函数(reviver),相对于起过滤作用的替代函数(replacer)

  • 举例:

    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);
    let bookCopy = JSON.parse(jsonText,
    (key, value) => key == "releaseDate" ? new Date(value) : value);
    alert(bookCopy.releaseDate.getFullYear());

    以上代码在 book 对象中增加了 releaseDate 属性,是一个 Date 对象。这个对象在被序列化为JSON 字符串后,又被重新解析为一个对象 bookCopy。

    这里的还原函数会找"releaseDate"键,如果找到就会根据它的日期字符串创建新的 Date 对象。得到的 bookCopy.releaseDate 属性又变回了Date 对象,因此可以调用其 getFullYear()方法。

原文地址:https://www.cnblogs.com/jefferys232/p/15395371.html