5分钟了解JSON那些事儿
JSON
简介
- JSON是JavaScript Object Notation(JavaScript对象表示法)的缩写
- JSON是一种数据格式, 而不是一种编程语言, 用来表示结构化数据
- JSON是JavaScript的一个严格子集
- JSON并不从属于JavaScript, 很多编程语言都可以用JSON数据格式
语法
JSON语法可以表示以下三种类型的值:
- 简单值: 字符串/数值/布尔值/
null, 但是不支持undefined - 对象
- 数组
JSON不支持变量/函数/对象实例
简单值
字符串
"Hello JSON"
数字
66
布尔值
true
null
null
对象
和JavaScript对比来看 ->
- JavaScript表示对象
键值对的键可以加引号也可以不加, 如果加引号, 可以加单引号也可以加双引号
// 最常见就这么写
const obj1 = {
foo: 'bar',
num: 66,
status: true
};
// 这么写也oconstet obj2 = {
'foo': 'bar',
'num': 66,
'status': true
};
// 这么写也ok
const obj1 = {
"foo": "bar",
"num": 66,
"status": true
};- JSON表示对象
键值对的键必须加双引号(手写JSON时一定要注意)
对象没有变量声明, 因为JSON根本就没有变量的概念(它不是一个编程语言)
末尾没有分号
{
"foo": "bar",
"num": 66,
"status": true
}和JavaScript相似, 对象可以嵌套对象
{
"foo": "bar",
"num": 66,
"status": true,
"baz": {
"num": 88
}
}注, 同名属性可以在不同的对象中, 但是不能出现在同一个对象中
数组
和JavaScript对比来看 ->
- JavaScript表示数组
let arr = ['hello', 66, true];
- JSON表示数组
同样没有变量声明和结尾的分号, 同时注意字符串简单值要加双引号
["hello", 66, true]
数组和对象结合起来可以构成复杂的集合, 比如students.json文件中可能是这样婶儿的
[
{
"name": "小明",
"age": 10,
"score": {
"math": 88,
"english": 99
}
},
{
"name": "小强",
"age": 11,
"score": {
"math": 98,
"english": 96
}
}
]看到以上同JavaScript的不同之处, 我们可以知道为什么说JSON是JavaScript的一个严格子集了吧
JSON序列化与解析
基本用法
ECMAScript5定义了全局对象JSON, 用来解析JSON字符串
简单来说, JSON对象有两个方法
JSON.stringify(): 把JavaScript对象序列化为JSON字符串JSON.parse(): 把JSON字符串解析为原生JavaScript值
const book = {
name: 'Learn JavaScript in One Day',
pages: 1
};
const jsonText = JSON.stringify(book); // 序列化
// "{"name":"Learn JavaScript in One Day","pages":1}"
const parseText = JSON.parse(jsonText); // 解析
// {name: "Learn JavaScript in One Day", pages: 1}默认情况下, JSON.stringify()输出的JSON字符串不包含任何空格字符或缩进(是不是给我们提供了一种将去除数据中无用的空白和缩进的方法呢).
在序列化JavaScript对象时, 所有函数及原型成员都会被有意忽略, 不体现在结果中. 此外, 值为undefined的任何属性也都会被跳过. 结果中最终都是值为有效JSON数据类型的实例属性.
const book = {
name: 'Learn JavaScript in One Day',
pages: 1,
foo: undefined
};
const jsonText = JSON.stringify(book); // 序列化
// "{"name":"Learn JavaScript in One Day","pages":1}"
// foo的值为undefined, 所被忽略掉了将JSON字符串直接传递给JSON.parse()就可以得到相应的JavaScript值.
JSON.parse()就是JSON.stringify()的逆向操作. 将一个JavaScript值序列化之后再解析JSON.parse(JSON.stringify(foo))和原来的foo几乎一样.
注意, 为什么说是几乎一样呢?
- 如果foo是一个对象或数组, 那么这么一折腾就变成了两个不同的对象或数组了;
这就提供了一种克隆对象和数组的方法