JSON 基本概念

JSON 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。它基于 JavaScript 的对象字面量语法,但已经成为一种通用的数据格式,被几乎所有编程语言支持。

JSON 的基本数据类型
  • 字符串:必须使用 双引号 包围。

  • 数字:整数或浮点数。

  • 布尔值:true 或 false。

  • 数组:有序的值列表,使用方括号 []

  • 对象:键值对集合,使用花括号 {}

  • null:表示空值。

Json示例

JSON常用于前后端数据传输和配置文件。以下是各种JSON示例及其在JavaScript中的使用方法:

1. 基本JSON数据类型示例
// JSON字符串
"Hello, World!"

// JSON数字
42

// JSON布尔值
true
false

// JSON空值
null
2. JSON对象示例
{
  "name": "张三",
  "age": 30,
  "isStudent": false,
  "email": "zhangsan@example.com"
}
3. 嵌套JSON对象示例
{
  "person": {
    "name": "李四",
    "contact": {
      "email": "lisi@example.com",
      "phone": "13800138000"
    },
    "address": {
      "country": "中国",
      "city": "上海",
      "street": "南京东路123号"
    }
  }
}
4. JSON数组示例
[
  "苹果",
  "香蕉",
  "橙子",
  "葡萄"
]
5. 包含对象的JSON数组示例
[
  {
    "id": 1,
    "name": "产品A",
    "price": 99.99
  },
  {
    "id": 2,
    "name": "产品B",
    "price": 199.99
  },
  {
    "id": 3,
    "name": "产品C",
    "price": 299.99
  }
]
6. 复杂混合结构的JSON示例
{
  "company": "科技有限公司",
  "founded": 2010,
  "active": true,
  "employees": [
    {
      "id": "E001",
      "name": "王五",
      "position": "经理",
      "skills": ["管理", "沟通", "领导力"]
    },
    {
      "id": "E002",
      "name": "赵六",
      "position": "开发工程师",
      "skills": ["JavaScript", "React", "Node.js"]
    }
  ],
  "departments": ["研发", "市场", "行政"],
  "location": {
    "country": "中国",
    "city": "北京",
    "coordinates": {
      "lat": 39.9042,
      "lng": 116.4074
    }
  },
  "contact": null
}
7. 在JavaScript中使用JSON
// 将JSON字符串解析为JavaScript对象
const jsonString = '{"name":"张三","age":30,"isStudent":false}';
const userObject = JSON.parse(jsonString);
console.log("解析后的对象:", userObject);
console.log("用户名:", userObject.name);

// 将JavaScript对象转换为JSON字符串
const product = {
  id: 1,
  name: "笔记本电脑",
  price: 5999,
  inStock: true,
  tags: ["电子产品", "计算机"]
};
const productJSON = JSON.stringify(product);
console.log("转换后的JSON字符串:", productJSON);

// 使用JSON.stringify的第二个参数进行格式化
const formattedJSON = JSON.stringify(product, null, 2); // 第三个参数指定缩进空格数
console.log("格式化的JSON:", formattedJSON);

// 使用JSON.stringify的第二个参数过滤属性
const filteredJSON = JSON.stringify(product, ['name', 'price']);
console.log("过滤后的JSON:", filteredJSON);
8. JSON的实际应用示例 - API响应模拟
// 模拟API返回的JSON数据
const apiResponse = {
  "status": "success",
  "code": 200,
  "message": "数据获取成功",
  "data": {
    "total": 100,
    "page": 1,
    "pageSize": 10,
    "items": [
      // 这里是数据项...
    ]
  },
  "timestamp": "2023-05-15T10:30:00Z"
};

// 处理API响应
function handleApiResponse(response) {
  if (response.status === 'success' && response.code === 200) {
    console.log(`共${response.data.total}条数据,当前第${response.data.page}页`);
    // 处理数据项...
  } else {
    console.error(`请求失败: ${response.message || '未知错误'}`);
  }
}

handleApiResponse(apiResponse);

JSON与JavaScript对象的区别

相同点
  • 语法相似,都使用键值对表示对象。

  • 都支持数组、字符串、数字、布尔值等基本数据类型。

不同点

特性

JSON

JavaScript Object

本质

数据交换格式,纯文本

编程语言中的数据结构,内存中的对象

键名/属性名

必须使用双引号包围

可以使用双引号、单引号或不用引号;也可以使用标识符、数字作为属性名

字符串表示

必须使用双引号

可以使用双引号、单引号或反引号(模板字符串)

值类型支持

只支持:字符串、数字、布尔值、对象、数组、null

支持:所有JSON类型 + undefined、函数、Symbol、Date、RegExp等

函数/方法

不支持函数定义

可以包含方法和函数作为属性值

注释

不允许任何形式的注释

允许单行注释(//)和多行注释(/* */)

尾随逗号

不允许,会导致语法错误

ES6+ 允许对象和数组中的尾随逗号

undefined值

不支持

支持undefined值表示未定义

Symbol类型

不支持

 ES6+ 支持Symbol作为属性键和值

日期对象

没有原生日期类型,需以字符串形式表示(如ISO格式)

有内置Date对象类型

数字格式

数字不能有前导零(除非是0本身)

支持八进制、十六进制等多种数字表示法,前导零在严格模式下可能有特殊含义

正则表达式

不支持

有内置RegExp对象类型

用途

主要用于数据存储、传输和配置

用于代码执行过程中的数据管理和操作

解析/序列化

通过各语言的JSON解析器处理

JavaScript对象是语言原生支持的数据结构

示例对比

Json

{
  "name": "张三",
  "age": 25,
  "isStudent": false,
  "hobbies": ["阅读", "游泳"],
  "address": {
    "city": "北京",
    "district": "朝阳区"
  },
  "birthday": "1999-01-01",
  "metadata": null
}

JavaScript Object

{
  name: "张三",         // 键名不需要引号
  age: 25,
  isStudent: false,
  hobbies: ["阅读", "游泳"],
  address: {
    city: "北京",
    district: "朝阳区"
  },
  birthday: new Date("1999-01-01"),  // Date 对象
  metadata: undefined,               // undefined 值
  greet() {                          // 方法
    return `你好,我是${this.name}`;
  }
  // 尾随逗号允许
详细说明:

1. 键名/属性名差异

JSON要求所有属性名必须用双引号包围,这是语法强制要求。而JavaScript对象的属性名更加灵活:

  • 可以是标识符(无需引号)。

  • 可以是带双引号的字符串。

  • 可以是带单引号的字符串。

  • 可以是数字(会自动转换为字符串)。

  • ES6+ 支持Symbol作为属性键。

2. 字符串表示差异

JSON中所有字符串都必须用双引号包围,而JavaScript支持三种字符串表示方式:

  • 双引号:"hello"

  • 单引号:'hello'

  • 反引号(模板字符串):` hello ${name} `

3. 数字格式差异

JSON中数字不能有前导零(除了0本身),例:0123 0123 是无效的JSON。而JavaScript支持多种数字表示法:

  • 十进制:123。

  • 八进制(ES5中以0开头,ES6+中以0o开头)0o173。

  • 十六进制(以0x开头)0x7B。

  • 科学计数法 1.23e2。

4. 本质差异

这是最根本的区别:JSON是一种 数据格式,主要用于数据交换;而JavaScript对象是 编程语言中的数据结构,用于程序执行过程中的数据操作。

5. 转换关系

JSON和JavaScript对象可以通过内置方法进行相互转换:

示例:
// JavaScript对象转JSON字符串
const obj = { name: "小罗", age: 25 };
const jsonStr = JSON.stringify(obj);  // {"name":"小罗","age":25}

// JSON字符串转JavaScript对象
const jsonStr = '{"name":"小罗","age":25}';
const obj = JSON.parse(jsonStr);      // {name: "小罗", age: 25}

6. 关键区别:JSON格式 VS JavaScript字符串字面量

  1. JSON格式内部的字符串

  • JSON规范要求:JSON数据中的所有字符串(包括属性名和属性值)必须 使用双引号包围。

  • 例如 {"name":"张三"} 是有效的JSON。

  • 而 {'name':'张三'} 不是有效的JSON。

  1. 在JavaScript代码中表示JSON字符串

  • 当我们在JavaScript代码中需要表示一个JSON字符串时,可以使用JavaScript的字符串字面量语法。

  • JavaScript允许字符串字面量使用单引号、双引号或反引号。

  • 所以在代码中,我们可以这样写const jsonStr = '{"name":"张三"}';

示例解释:

上例代码示例: const jsonStr = '{"name":"张三","age":25}'; 中:

  • 外层的单引号 ' 是JavaScript的字符串字面量分隔符。

  • 内层的双引号 " 是JSON格式要求的字符串分隔符。

  • 双引号前的反斜杠 \ 是JavaScript的转义字符,表示后面的双引号是字符串内容的一部分,而不是字符串的结束。

等效写法:

// 使用单引号作为JavaScript字符串分隔符(推荐,避免转义)
const jsonStr1 = '{"name":"张三","age":25}';

// 使用双引号作为JavaScript字符串分隔符(需要转义内部的双引号)
const jsonStr2 = "{\"name\":\"张三\",\"age\":25}";

// 使用反引号作为JavaScript字符串分隔符(需要转义内部的双引号)
const jsonStr3 = `{\"name\":\"张三\",\"age\":25}`;

总结

JSON作为一种轻量级数据交换格式,其语法规则比JavaScript对象更为严格和规范,这保证了跨平台、跨语言数据交换的可靠性。而JavaScript对象作为编程语言的数据结构,提供了更丰富的功能和灵活性,以满足程序执行过程中的各种需求。

理解这些差异对于正确处理数据交换、避免解析错误以及高效使用JavaScript编程都至关重要。