这是我参与11月更文挑战的第22天,活动详情查看: 2021最后一次更文挑战
JSON是 JavaScript 的子类,也是作为更好的互联网传输结构化数据格式逐渐取代 XML,因此要理解 JSON,重要的是理解它是一种数据格式,不是一种编程语言。虽然具有相同的语法形式,但 JSON 并不从属 JavaScript。
简单值:可以在 JSON 中表示字符串、数值、布尔值和
null
,但是不支持
undefined
。如:
JSON 字符串必须使用
双引号
,否则会导致语法错误。
对象:表示的是一组无序的键值对。JSON 中的对象要求给属性加
引号
。
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的属性值也会被跳过。