这是我参与11月更文挑战的第22天,活动详情查看: 2021最后一次更文挑战

JSON是 JavaScript 的子类,也是作为更好的互联网传输结构化数据格式逐渐取代 XML,因此要理解 JSON,重要的是理解它是一种数据格式,不是一种编程语言。虽然具有相同的语法形式,但 JSON 并不从属 JavaScript。

简单值:可以在 JSON 中表示字符串、数值、布尔值和 null ,但是不支持 undefined 。如:

"name" : "zhangsan" , "age" : 20

JSON 字符串必须使用 双引号 ,否则会导致语法错误。

对象:表示的是一组无序的键值对。JSON 中的对象要求给属性加 引号

"object" : { "name" : "zhangsan" , "age" : 20

JSON 对象没有声明变量,没有变量的概念;没有末尾的分号。

数组:表示的是一组有序的值得列表。可通过索引来访问其中的值。

"arr" : [ 20 , "nickname" , true ]

JSON 数组没有变量和分号。

// 数组和对象结合
    "object": {
        "name": "zhangsan",
        "age": 20,
        "arr": [
            { "label": "标签", "address": "地址" }

JSON 可以把 JSON 数据结构解析为有用的 JavaScript 对象。

JSON 对象

JSON 对象有两个方法:stringify()parse(),用于把 JavaScript 对象序列化为 JSON 字符串和把 JSON 字符串解析为原生 JavaScript 值。

var book = {
    title: "Professional JavaScript",
    authors: ["zhangsan"],
    edition: 3,
    year: 2021
var jsonText = JSON.stringify(book);
console.log(jsonText);
var bookCopy = JSON.parse(jsonText);
console.log(bookCopy);
序列化选项

早期的JSON解析器基本上都使用了eval()函数,但是可能会执行恶意代码(eval函数可以解析,解释并返回js对象。ECMASCRIPT 5再后来规范了JSON行为,定义了全局对象JSON,并添加了两个JSON方法: stringify() 和 parse()。

JSON.stringify() 还可以接收另外两个参数;第一个参数是过滤器,可以是数组,也可以是函数;第二个参数是一个选项,表示是否在 JSON 字符串中保留缩进。

var jsonText = JSON.stringify(book, ["title", "year"]);

控制结果中的缩进和空白符。如果参数是一个数值,表示每个级别缩进的空格数。如要缩进4格:

var jsonText = JSON.stringify(book, null, 4);
toJSON() 方法

JSON.stringify() 不能满足对某些对象进行自定义序列化的需求,可以给对象定义 toJSON() 方法,返回其自身的 JSON 数据格式。

在序列化时,函数与原型对象成员都将被忽略(JSON只接受两种复杂类型对象与数组),值为undefined的属性值也会被跳过。