从入门到精通:JavaScript 中获取 JSON 数据的完整指南
在现代 Web 开发中,JSON(JavaScript Object Notation)已经成为数据交换的事实标准,无论是从服务器获取 API 响应,还是在本地存储配置信息,我们几乎都会与 JSON 打交道,对于 JavaScript 熟练如何从 JSON 数据中取出所需的信息是一项至关重要的技能。
本文将从最基础的概念讲起,逐步到各种复杂场景下的数据提取方法,助你彻底在 JS 中操作 JSON 的技巧。
JSON 是什么?它和 JS 对象有什么关系?
在开始之前,我们首先要明确一个常见的误区:JSON 不是一个 JavaScript 对象,而是一种字符串格式。
-
JavaScript 对象 (JS Object): 这是 JavaScript 语言在内存中的一种数据结构,用花括号 表示。
const jsObject = { name: "张三", age: 30, isStudent: false }; -
JSON (JavaScript Object Notation): 它是一种基于 JS 对象语法的文本格式,专门用于数据交换,它必须是字符串形式,通常用单引号或双引号包裹。
const jsonString = '{"name": "张三", "age": 30, "isStudent": false}';
核心区别:JSON 的键(key)必须用双引号 包裹,而 JS 对象的键可以用单引号、双引号或不加引号(如果标识符是合法的),JSON 中不能包含函数或 undefined。
当我们在 JS 中处理 JSON 时,通常需要经历两个步骤:
- 接收 JSON 字符串(例如从服务器 API 返回)。
- 将其转换为 JS 对象,这样才能方便地访问其属性。
第一步:将 JSON 字符串转换为 JS 对象
在我们可以“取出”数据之前,必须先把 JSON 字符串“翻译”成 JS 能理解的 JS 对象,这个过程叫做反序列化。
方法 1:JSON.parse() - 最标准、最安全的方法
这是处理 JSON 字符串最常用、最标准的方法,它接收一个 JSON 格式的字符串,并返回一个对应的 JS 对象。
示例: 假设我们从服务器得到了一个 JSON 响应。
// 1. 模拟从服务器接收到的 JSON 字符串
const apiResponse = '{"id": 101, "user": "李四", "hobbies": ["reading", "coding"]}';
// 2. 使用 JSON.parse() 将其转换为 JS 对象
const userData = JSON.parse(apiResponse);
// 3. userData 就是一个真正的 JS 对象了,我们可以自由访问它
console.log(userData); // 输出: { id: 101, user: '李四', hobbies: [ 'reading', 'coding' ] }
console.log(userData.user); // 输出: 李四
console.log(userData.hobbies[0]); // 输出: reading
⚠️ 重要提醒:如果传入 JSON.parse() 的字符串不是一个合法的 JSON 格式,它会抛出一个 SyntaxError,在处理不可信的数据源时,最好使用 try...catch 来捕获错误。
const invalidJson = "{ name: '王五' }"; // 键没有用引号包裹,是无效的 JSON
try {
const data = JSON.parse(invalidJson);
console.log(data);
} catch (error) {
console.error("解析 JSON 失败:", error.message);
// 输出: 解析 JSON 失败: Unexpected token n in JSON at position 2
}
方法 2:直接使用 JS 对象
在某些情况下,比如你的 JSON 数据是直接写在代码里的(例如配置文件),你其实根本不需要 JSON.parse(),因为 JS 引擎会直接将其解析为一个对象。
// 这不是 JSON 字符串,它是一个 JS 对象字面量
const config = {
apiUrl: 'https://api.example.com',
timeout: 5000
};
// 你可以直接访问,无需任何转换
console.log(config.apiUrl); // 输出: https://api.example.com
第二步:从 JS 对象中取出数据
一旦你拥有了一个 JS 对象,取出数据就变得非常直观了,主要有两种方式:点表示法和中括号表示法。
方法 1:点表示法 (Dot Notation)
这是最常用、最简洁的方式,适用于当你知道属性名,并且属性名是一个合法的 JS 标识符时(不含空格、特殊字符,且不是保留字)。
const person = {
firstName: "赵六",
lastName: "钱七",
contact: {
email: "zhaoliu@example.com"
}
};
// 取出简单属性
console.log(person.firstName); // 输出: 赵六
// 取出嵌套对象中的属性
console.log(person.contact.email); // 输出: zhaoliu@example.com
方法 2:中括号表示法 (Bracket Notation)
当你需要动态访问属性,或者属性名包含空格、连字符等特殊字符时,中括号表示法就派上用场了。
const product = {
"product name": "超级智能手机",
"price-point": "$999",
"in stock": true
};
// 使用点表示法会报错
// console.log(product.product name); // SyntaxError
// 使用中括号表示法,属性名必须用引号包裹
console.log(product["product name"]); // 输出: 超级智能手机
console.log(product["price-point"]); // 输出: $999
console.log(product["in stock"]); // 输出: true
// 动态访问属性
const dynamicKey = "product name";
console.log(product[dynamicKey]); // 输出: 超级智能手机
处理嵌套和复杂数据结构
JSON 数据常常是嵌套的,包含对象和数组,访问它们需要逐层“”。
const complexData = {
id: 202,
user: {
info: {
name: "孙八",
location: "北京"
}
},
tags: ["前端", "JavaScript", "Vue"]
};
// 1. 访问深层嵌套对象
const userName = complexData.user.info.name;
console.log(userName); // 输出: 孙八
// 2. 访问数组中的元素
const firstTag = complexData.tags[0];
console.log(firstTag); // 输出: 前端
// 3. 组合使用:访问数组对象的属性
const dataWithArray = {
results: [
{ id: 1, name: "项目A" },
{ id: 2, name: "项目B" }
]
};
const secondProjectName = dataWithArray.results[1].name;
console.log(secondProjectName); // 输出: 项目B
实战场景:从 API 获取并解析 JSON
让我们把所有知识串联起来,看看一个完整的真实世界案例:使用 fetch API 从一个公共服务器获取数据。
假设我们要获取一个随机的用户信息:https://randomuser.me/api/
async function fetchRandomUser() {
try {
// 1. 发起网络请求,获取 JSON 响应
const response = await fetch('https://randomuser.me/api/');
// 2. 检查请求是否成功
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
// 3. 使用 response.json() 将响应体解析为 JS 对象
// 注意:response.json() 本身就是一个返回 Promise 的 JSON.parse()
const data = await response.json();
// 4. 从解析后的对象中取出我们需要的数据
const user = data.results[0];
const fullName = `${user.name.first} ${user.name.last}`;
const email = user.email;
const location = `${user.location.city}, ${user.location.country}`;
console.log("获取到随机用户信息:");
console.log(`姓名: ${fullName}`);
console.log(`邮箱: ${email}`);
console.log(`位置: ${location}`);
} catch (error) {
console.error("获取用户数据时出错:", error);
}
}
// 调用函数
fetchRandomUser();
在这个例子中,response.json() 是一个非常方便的方法,它内部调用了 JSON.parse(),并为我们返回一个 Promise,该 Promise 会解析为 JS 对象。
从 JSON 中取出数据的过程可以概括为以下核心步骤:
- 识别来源:明确你拿到的是 JSON 字符串还是 JS 对象。
- 转换(如果需要):如果是 JSON 字符串,使用
JSON.parse()将其转换为 JS 对



还没有评论,来说两句吧...