JSON概述
JSON:JavaScript Object Notation(JavaScript 对象标记法),它是一种存储和交换数据的语法。
当数据在浏览器与服务器之间进行交换时,这些数据只能是文本,JSON 属于文本并且我们能够把任何 JavaScript 对象转换为 JSON,然后将 JSON 发送到服务器。我们也能把从服务器接收到的任何 JSON 转换为 JavaScript 对象。以这样的方式,我们能够把数据作为 JavaScript 对象来处理,无需复杂的解析和转译。
JSON语法
在json中,每一个数据项,都是由一个键值对(或者说是名值对)组成的,但是键必须是字符串,且由双引号包围,而值必须是以下数据类型之一:
- 字符串(在 JSON 中,字符串值必须由双引号编写)
- 数字
- 对象(JSON 对象)
- 数组
- 布尔
- null
JSON 的值不可以是以下数据类型之一:
- 函数
- 日期
- undefined
因为 JSON 语法由 JavaScript 对象标记法衍生而来,所以很少需要其它额外的软件来处理 JavaScript 中的 JSON。
通过 JavaScript,创建对象并向其分配数据,就像这样:
var person = {"name": "zhangsan", "age": 62, "city": "BeiJing"};
console.log(person);
JSON数据类型
JSON 字符串
JSON 中的字符串必须用双引号包围。
{"name": "John"}
JSON 数字
JSON 中的数字必须是整数或浮点数。
{"age": 30}
JSON 对象
JSON 中的值可以是对象,JSON 中作为值的对象必须遵守与 JSON 对象相同的规则。
{
"employee": {"name": "Bill Gates", "age": 62, "city": "Seattle"}
}
JSON 数组
JSON 中的值可以是数组。
{
"employees": ["Bill", "Steve", "David"]
}
JSON 布尔
JSON 中的值可以是 true/false。
{"sale": true}
JSON字符串转JS对象
JSON.parse():可以将以JSON字符串转换为JS对象,它需要一个JSON字符串作为参数,会将该字符串转换为JS对象并返回
var jsonStr = '{"name":"孙悟空","age":18,"gender":"男"}';
var obj = JSON.parse(jsonStr);
console.log(obj);
JS对象转JSON字符串
JSON.stringify():可以将一个JS对象转换为JSON字符串,需要一个js对象作为参数,会返回一个JSON字符串
var obj = {name: "猪八戒", age: 28, gender: "男"};
var jsonStr = JSON.stringify(obj);
console.log(jsonStr);
JSON VS Protocol Buffers(protobuf)
特性 | JSON | Protocol Buffers (protobuf) |
---|---|---|
全称 | JavaScript Object Notation | Protocol Buffers |
创建者 | Douglas Crockford | |
数据表示 | 人类可读的文本格式 | 二进制格式 |
易读性 | 良好,人类可读 | 不易读,需要使用工具进行解析 |
性能 | 较慢,因为是文本格式,需要解析为二进制格式 | 高效,基于二进制,解析和序列化/反序列化性能极佳 |
文件大小 | 较大,尤其是包含大量数据时 | 较小,二进制格式,数据压缩效果更好 |
灵活性 | 高,支持动态结构,可以在运行时决定数据的结构 | 中等,需要预先定义数据结构,但通过字段标签可以实现一定的灵活性 |
Schema 定义 | 无强制要求,可以没有 schema | 强制使用 schema 定义 .proto 文件 |
语言支持 | 原生支持多种语言 (JavaScript, Python, Java 等) | 通过官方插件支持多种语言 (C++, C#, Java, Python, Go, 等) |
自描述性 | 自描述,每个对象可以携带数据结构的信息 | 需要 schema 文件才能理解数据格式 |
扩展性 | 较好,容易添加新字段,不影响已有数据 | 良好,可通过字段标签确保向后兼容 |
错误处理 | 较易诊断,错误信息明确 | 难于诊断,错误信息不易读 |
主要应用 | Web 应用客户端与服务器的数据交换,配置文件等 | 高性能数据交换、大规模数据传输、网络通信 |
与语言的耦合度 | 低,语言无关,但通常在 JavaScript 环境中作为默认格式 | 中等,与具体编译器生成的代码格式相关,但有官方插件支持各种语言 |
使用者 | 广泛用于互联网公司和应用 (如 REST API, 配置文件等) | 广泛用于 Google 内部系统和要求高效传输的数据交换场景 |