JavaScript 获取 JSON 节点的实用指南
在 Web 开发中,JSON(JavaScript Object Notation)因其轻量级、易读性和与 JavaScript 的天然兼容性,成为数据交互的主流格式,无论是从 API 接口获取数据,还是处理本地配置文件,经常需要从 JSON 数据中提取特定节点的值,本文将详细介绍 JavaScript 中获取 JSON 节点的多种方法,从基础到进阶,帮助你灵活应对不同场景。
JSON 数据的基础结构
在开始获取节点之前,先简单回顾 JSON 的两种核心结构:
- 对象(Object):用 表示,键值对集合,键必须是字符串(双引号包裹),值可以是字符串、数字、布尔值、数组、对象或 null。
{ "name": "张三", "age": 25, "isStudent": false, "courses": ["数学", "英语"], "address": { "city": "北京", "district": "海淀区" } } - 数组(Array):用
[]表示,有序值列表,值可以是任意 JSON 允许的类型。[ {"id": 1, "name": "商品A"}, {"id": 2, "name": "商品B"} ]
获取 JSON 节点的方法
点表示法(Dot Notation)
当 JSON 的键是有效的 JavaScript 标识符(不含空格、特殊字符,不以数字开头)时,可以使用点表示法逐级访问节点。
示例:
假设有以下 JSON 数据(存储在变量 user 中):
const user = {
"name": "李四",
"age": 30,
"contact": {
"email": "lisi@example.com",
"phone": "13800138000"
}
};
获取 name 和 email:
console.log(user.name); // 输出: "李四" console.log(user.contact.email); // 输出: "lisi@example.com"
注意事项:
- 键名必须符合 JavaScript 标识符规则(如
user.1st会报错,因为1st不是合法标识符)。 - 如果中间节点不存在,会抛出
TypeError(如user.contact.address.city会报错,因为address不存在)。
方括号表示法(Bracket Notation)
方括号表示法更灵活,适用于以下场景:
- 键名包含空格、特殊字符(如
"user name"、"age#1"); - 键名是动态变量(如通过循环或用户输入确定键名);
- 键名以数字开头。
示例:
const data = {
"user name": "王五",
"1st-place": "冠军",
"info": {
"age#1": 28
}
};
// 键名含空格和特殊字符
console.log(data["user name"]); // 输出: "王五"
console.log(data["1st-place"]); // 输出: "冠军"
// 动态键名
const dynamicKey = "age#1";
console.log(data.info[dynamicKey]); // 输出: 28
注意事项:
- 键名必须用双引号或单引号包裹(如
data[user name]会报错,因为 JavaScript 会尝试解析变量user)。 - 同样,如果中间节点不存在,会抛出
TypeError。
可选链操作符(Optional Chaining )
可选链是 ES2020 引入的特性,用于简化“安全访问嵌套节点”的场景,如果中间节点为 null 或 undefined,表达式会直接返回 undefined,而不会抛出错误。
语法:
obj?.key?.subKey
示例:
假设 user 数据可能不包含 contact 节点:
const user1 = {
"name": "赵六",
"contact": {
"email": "zhaoliu@example.com"
}
};
const user2 = {
"name": "钱七"
// 没有 contact 节点
};
// 传统方式需要判断
console.log(user1.contact ? user1.contact.email : undefined); // 输出: "zhaoliu@example.com"
console.log(user2.contact ? user2.contact.email : undefined); // 输出: undefined
// 可选链简化
console.log(user1.contact?.email); // 输出: "zhaoliu@example.com"
console.log(user2.contact?.email); // 输出: undefined
注意事项:
- 可选链只能用于访问属性,不能用于调用方法(如
obj?.method?.()是合法的,但obj?.()会报错)。 - 可选链不会跳过
null或undefined之后的非属性访问(如obj?.a.b,obj为null,返回undefined;obj.a为null,访问b会报错)。
空值合并操作符(Nullish Coalescing )
空值合并操作符(ES2020)常与可选链配合使用,当节点不存在或值为 null/undefined 时,提供默认值。
语法:
value ?? defaultValue
示例:
const user = {
"name": "孙八",
"age": null,
"gender": undefined
};
console.log(user.age ?? 18); // 输出: 18(因为 age 是 null)
console.log(user.gender ?? "未知"); // 输出: "未知"(因为 gender 是 undefined)
console.log(user.address ?? "地址未填写"); // 输出: "地址未填写"(address 不存在,返回 undefined)
与 的区别:
是“逻辑或”,会在左侧值为“假值”(0、、false、null、undefined、NaN)时返回右侧值;而 仅在左侧为 null 或 undefined 时返回右侧值。
console.log(0 ?? 10); // 输出: 0(0 不是 null/undefined) console.log(0 || 10); // 输出: 10(0 是假值)
访问数组节点
JSON 数组通过索引(从 0 开始)访问元素,结合方括号表示法或可选链可处理嵌套数组。
示例:
const students = [
{"id": 1, "name": "小明", "scores": [90, 85, 88]},
{"id": 2, "name": "小红", "scores": [92, 89, 95]}
];
// 访问第一个学生的姓名
console.log(students[0].name); // 输出: "小明"
// 访问第二个学生的第一门成绩
console.log(students[1].scores[0]); // 输出: 92
// 动态索引
const studentIndex = 0;
const subjectIndex = 1;
console.log(students[studentIndex].scores[subjectIndex]); // 输出: 85
// 可选链处理数组
const emptyStudents = [];
console.log(emptyStudents[0]?.name); // 输出: undefined(emptyStudents[0] 不存在)
动态获取节点(键名变量)
当键名是动态变量(如通过循环、用户输入或配置文件确定)时,需使用方括号表示法将变量作为键名。
示例:
const config = {
"apiUrl": "https://api.example.com",
"timeout": 5000,
"retryTimes": 3
};
// 动态键名
const keys = ["apiUrl", "timeout", "retryTimes"];
keys.forEach(key => {
console.log(`${key}: ${config[key]}`);
});
// 输出:
// apiUrl: https://api.example.com
// timeout: 5000
// retryTimes: 3
// 用户输入的键名
const userInput = "timeout";
console.log(`用户配置的值: ${config[userInput]}`); // 输出: 用户配置的值: 5000
使用 Object.values() 和 Object.entries() 处理对象
如果需要获取对象的所有值或键值对(而非特定节点),可以使用 Object.values() 和 Object.entries()。
示例:
const product = {
"id": 101,
"name": "笔记本电脑",
"price": 4999
};
// 获取所有


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