一文带你了解JSON
一、认识JSON
在目前的开发中,JSON是一种非常重要的数据格式,它并不是编程语言,而是一种可以在服务器和客户端之间传输的数据格式,它可以被任何的编程语言读取和作为数据格式来传递。
- JSON的使用场景:
- 网络数据的传输JSON数据;
- 项目的某些配置文件;
- 非关系型数据库(NoSQL)将json作为存储格式;
1.1 JSON的基本语法
- JSON的顶层支持三种类型的值:
- 简单值:数字(Number)、字符串(String,不支持单引号)、布尔类型(Boolean)、null类型;
- 对象值:由key、value组成,key是字符串类型,并且必须添加双引号,值可以是简单值、对象值、数组值;
- 数组值:数组的值可以是简单值、对象值、数组值;
- 注意事项:
- 对象的属性名必须使用双引号,值要是字符串也必须使用双引号
- 键与值之间使用冒号连接, 多个键值对之间使用逗号分隔
- 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
- 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和
null
(不能使用NaN
,Infinity
,-Infinity
和undefined
)。 - 数组或对象最后一个成员的后面,不能加逗号。
二、对象序列化
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
- 某些情况下我们希望将JavaScript中的复杂类型转化成JSON格式的字符串,这样方便对其进行处理:
- 比如我们希望将一个对象保存到localStorage中;
- 但是如果我们直接存放一个对象,这个对象会被转化成 [object Object] 格式的字符串,并不是我们想要的结果;
- JSON序列化/反序列化方法
- stringify方法:将JavaScript类型转成对应的JSON字符串;
- parse方法:解析JSON字符串,转回对应的JavaScript类型;
2.1 JSON序列化
-
JSON.stringify(value[, replacer [, space]])
-
JSON.stringify()
方法将一个 JavaScript 对象或值转换为 JSON 字符串 -
返回值:一个表示给定值的 JSON 字符串。
-
replacer 参数
- 如果指定了一个 replacer 函数,则可以选择性地替换值
- 或者指定的 replacer 是数组,则可选择性地仅包含数组指定的属性
const stuString1 = JSON.stringify(stu)
console.log(stuString1)
// 输出如下:{"name":"zhang","age":19,"sex":"female"}
// replacer是数组
const stuString2 = JSON.stringify(stu, ["name", "age"])
console.log(stuString2)
// 输出如下: {"name":"zhang","age":19}
// replacer是函数
const stuString3 = JSON.stringify(stu, (key, value) => {
if (key === "name") {
return "xiaozhang"
}
return value
})
console.log(stuString3);
// 输出如下:{"name":"xiaozhang","age":19,"sex":"female"}
- space参数
space
参数用来控制结果字符串里面的间距,用于美化输出(pretty-print)- 如果是一个数字,则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多 10 个空格)
- 该值若小于 1,则意味着没有空格;
- 如果该参数为字符串(当字符串长度超过 10 个字母,取其前 10 个字母),该字符串将被作为空格;
- 如果该参数没有提供(或者为 null),将没有空格。
const stuString1 = JSON.stringify(stu, null, 2)
console.log(stuString1)
const stuString1 = JSON.stringify(stu, null, "\t")
console.log(stuString1)
- toJSON方法
- 如果一个被序列化的对象拥有
toJSON
方法,那么该toJSON
方法就会覆盖该对象默认的序列化行为:不是该对象被序列化,而是调用toJSON
方法后的返回值会被序列化
- 如果一个被序列化的对象拥有
例如:
var stu = {
name: "zhang",
age: 19,
sex: "female",
toJSON: function() {
return "jean"
}
}
2.2 JSON反序列化
JSON.parse()
方法用来解析 JSON 字符串,构造由字符串描述的 JavaScript 值或对象JSON.parse(text[, reviver])
- 返回值:
Object
类型,对应给定 JSON 文本的对象/值。 - 提供可选的 reviver 函数用以在返回之前对所得到的对象执行变换(操作)。
const stuString = JSON.stringify(stu)
const info = JSON.parse(stuString, function(key, value) {
if (key == "age") {
return value + 2
}
return value
})
console.log(info);
//输出如下:{name: 'zhang', age: 21, sex: 'female'}