网站

JSON

使用 JSON - JavaScript | MDN

引入

JavaScript 需要和服务器交换数据,或者把复杂数据保存到本地。这些数据需要一个通用格式,方便传输和存储。JSON 就是这样一个轻量级的数据交换格式,几乎所有编程语言都能识别它。

定义

定义

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于在不同系统之间传递数据。它的语法来自 JavaScript 对象的写法,但 JSON 只是一个文本格式,和语言无关。

特点

  • JSON 本质是一个字符串,不是 JS 对象
  • 结构清晰,容易阅读和编写
  • 几乎所有编程语言都支持 JSON
  • 常用于前后端数据交换、配置文件、本地存储

语法规则

JSON 有严格的格式要求:

  • 数据使用键值对表示
  • 键必须用双引号 " 包裹,不能用单引号
  • 值可以是:字符串、数字、布尔值、数组、对象、null
  • 字符串必须用双引号包裹
  • 数组用 [] 表示
  • 对象用 {} 表示
  • 数据之间用逗号 , 分隔
  • 最后一个数据后面不能有逗号

合法的 JSON

{
  "name": "Tom",
  "age": 18,
  "isStudent": true,
  "skills": ["HTML", "CSS", "JS"],
  "address": {
    "city": "北京",
    "district": "朝阳区"
  }
}

不合法的 JSON

{
  name: "Tom",           // 键没有用双引号
  'age': 18,             // 键用了单引号
  "skills": ['HTML'],    // 数组元素用了单引号
  "address": {
    "city": "北京",
  }                      // 最后一个元素后面有逗号
}

常用方法

JavaScript 提供了两个方法用于 JSON 和对象之间的转换:

方法作用输入输出
JSON.stringify()把 JS 对象转换成 JSON 字符串JS 对象或数组JSON 字符串
JSON.parse()把 JSON 字符串转换成 JS 对象JSON 字符串JS 对象或数组

JSON.stringify() - 对象转字符串

把 JS 对象或数组转换成 JSON 字符串,方便传输或保存。

const user = {
  name: "Tom",
  age: 18,
  skills: ["HTML", "CSS", "JS"]
};
 
const jsonStr = JSON.stringify(user);
 
console.log(jsonStr);
// 输出:{"name":"Tom","age":18,"skills":["HTML","CSS","JS"]}
 
console.log(typeof jsonStr);
// 输出:string

JSON.parse() - 字符串转对象

把 JSON 字符串转换回 JS 对象或数组,方便在代码中使用。

const jsonStr = '{"name":"Tom","age":18,"skills":["HTML","CSS","JS"]}';
 
const user = JSON.parse(jsonStr);
 
console.log(user.name);  // 输出:Tom
console.log(user.skills[0]);  // 输出:HTML
 
console.log(typeof user);
// 输出:object

常见场景

前后端数据交换

服务器返回的数据通常是 JSON 字符串,需要用 JSON.parse() 转换成对象后才能使用。

fetch("/api/user")
  .then(function (response) {
    return response.json();  // response.json() 内部会调用 JSON.parse()
  })
  .then(function (data) {
    console.log(data.name);  // 这时 data 已经是 JS 对象
  });

发送数据给服务器时,需要用 JSON.stringify() 把对象转成字符串。

const user = {
  name: "Tom",
  age: 18
};
 
fetch("/api/user", {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify(user)  // 把对象转成 JSON 字符串
});

本地存储

localStorage 只能保存字符串,保存对象时需要先用 JSON.stringify() 转换。

const user = {
  name: "Tom",
  age: 18
};
 
// 保存数据
localStorage.setItem("user", JSON.stringify(user));
 
// 读取数据
const jsonStr = localStorage.getItem("user");
const user2 = JSON.parse(jsonStr);
 
console.log(user2.name);  // 输出:Tom

深拷贝对象

利用 JSON 的转换可以快速实现简单对象的深拷贝。

const user = {
  name: "Tom",
  age: 18,
  skills: ["HTML", "CSS"]
};
 
const user2 = JSON.parse(JSON.stringify(user));
 
user2.name = "Jerry";
user2.skills.push("JS");
 
console.log(user.name);  // 输出:Tom
console.log(user.skills);  // 输出:["HTML", "CSS"]

注意:这种方法有局限性,不能拷贝函数、undefinedSymbol、循环引用等特殊数据。

注意事项

  • JSON 字符串必须用双引号,单引号会报错
  • JSON.parse() 如果解析失败会抛出异常,需要用 try…catch 捕获
try {
  const data = JSON.parse('{"name": "Tom"}');
  console.log(data);
} catch (error) {
  console.log("JSON 格式错误", error);
}
  • JSON.stringify() 会忽略函数、undefinedSymbol
const obj = {
  name: "Tom",
  age: undefined,
  sayHello: function () {
    console.log("Hello");
  }
};
 
const jsonStr = JSON.stringify(obj);
 
console.log(jsonStr);
// 输出:{"name":"Tom"}
// age 和 sayHello 被忽略了
  • JSON 不支持注释,写配置文件时不能加注释
  • 数组转成 JSON 后仍然是数组格式
const list = ["HTML", "CSS", "JS"];
const jsonStr = JSON.stringify(list);
 
console.log(jsonStr);
// 输出:["HTML","CSS","JS"]

理解

JSON 就像是一个通用的数据包装盒,可以把 JS 对象装进字符串里,方便传输和保存。用的时候再拆开,还原成对象。

可以把 JSON.stringify() 理解为”打包”,把 JSON.parse() 理解为”拆包”。

前后端交换数据时,JSON 就是双方约定好的通用语言,后端写 Java、Python、PHP 都能生成 JSON,前端 JS 也能理解 JSON。

记住:JSON 只是字符串,不是对象。只有用 JSON.parse() 转换后,才能当对象使用。

引出

理解了 JSON 之后,可以结合 JS 网络请求JS 本地存储,实现数据的获取、保存和使用。

后续学习 JS 异步编程 时,会经常遇到 JSON 数据的处理。