如何轻松取出JSON中的数据:从基础到实践的全面指南
在当今的软件开发中,JSON(JavaScript Object Notation)已成为数据交换的主流格式,无论是API接口返回的数据、配置文件存储的信息,还是前后端交互的 payload,JSON 都以其轻量、易读、易解析的特性无处不在,面对复杂的 JSON 结构,如何准确、高效地取出所需数据,仍是许多开发者(尤其是初学者)的常见痛点,本文将从 JSON 的基础结构讲起,结合多种编程语言的实际案例,带你彻底“如何取出 JSON 中的数据”。
先搞懂:JSON 的核心结构是什么样的?
要取出 JSON 数据,首先要能看懂它的“骨架”,JSON 的数据结构主要有两种:对象(Object)和数组(Array),其他类型都是基于这两种结构的嵌套或组合。
对象(Object):用 包裹的键值对集合
对象以 开始,以 结束,内部是键(key): 值(value) 的无序组合,键必须是字符串(双引号包裹),值可以是多种类型。
{
"name": "张三",
"age": 25,
"isStudent": false,
"address": {
"city": "北京",
"district": "海淀区"
}
}
这里的 "name" "age" "isStudent" "address" 都是键,对应的值分别是字符串、数字、布尔值,以及另一个对象(嵌套对象)。
数组(Array):用 [] 包裹的有序列表
数组以 [ 开始,以 ] 结束,内部是多个值的有序集合,值可以是任意类型(包括对象或数组)。
[
{"id": 1, "product": "手机", "price": 4999},
{"id": 2, "product": "电脑", "price": 8999},
{"id": 3, "product": "平板", "price": 2999}
]
这是一个包含 3 个对象的数组,每个对象代表一个商品信息。
值的常见类型
- 基本类型:字符串(
"text")、数字(123、14)、布尔值(true/false)、null(空值)。 - 复合类型:对象()、数组(
[...]),两者可无限嵌套(如对象中嵌套数组,数组中再嵌套对象)。
取出数据的核心思路:按路径“定位”+ 按类型“取值”
无论 JSON 多复杂,取出数据的本质都是“按路径定位到目标值,再根据值的类型进行操作”,路径的表示方式类似文件路径(如 parent.child 或 parent[0].child),具体取决于语言。
不同语言中取出 JSON 数据的实践
JavaScript:原生 API 与现代方案
JavaScript 作为 JSON 的“母语”,提供了多种解析和取值方式,适合前端或 Node.js 开发。
(1)解析 JSON 字符串为 JavaScript 对象
JSON 数据是字符串形式(如 API 返回的 responseText),需先用 JSON.parse() 转换为对象:
const jsonString = '{"name": "李四", "hobbies": ["读书", "游泳"]}';
const dataObj = JSON.parse(jsonString);
(2)基本取值:点表示法 vs 括号表示法
-
点表示法:适用于键名是合法标识符(无空格、无特殊字符)的情况。
console.log(dataObj.name); // 输出: "李四" console.log(dataObj.hobbies); // 输出: ["读书", "游泳"]
-
括号表示法:适用于键名包含特殊字符(如空格、)或动态键名的情况。
const obj = {"user name": "王五", "user-age": 30}; console.log(obj["user name"]); // 输出: "王五" console.log(obj["user-age"]); // 输出: 30 // 动态键名 const dynamicKey = "user-age"; console.log(obj[dynamicKey]); // 输出: 30
(3)嵌套对象与数组取值
通过逐层点或括号访问嵌套结构:
const nestedData = {
"user": {
"info": {
"name": "赵六",
"contacts": {
"email": "zhaoliu@example.com",
"phones": ["13812345678", "13987654321"]
}
}
}
};
// 取嵌套对象值
console.log(nestedData.user.info.name); // 输出: "赵六"
console.log(nestedData.user.info.contacts.email); // 输出: "zhaoliu@example.com"
// 取数组值
console.log(nestedData.user.info.contacts.phones[0]); // 输出: "13812345678"
(4)现代方案:可选链()与空值合并()
当 JSON 结构可能存在“空值”(如某个字段不存在时),直接取值会报错,ES2022+ 的可选链和空值合并可避免这个问题:
const optionalData = {"name": "钱七", "address": {"city": "上海"}}; // 缺少 address.district
// 传统方式:可能报错(Cannot read properties of undefined)
// console.log(optionalData.address.district); // TypeError
// 可选链:若中间步骤为 undefined,直接返回 undefined,不会报错
console.log(optionalData.address?.district); // 输出: undefined
// 空值合并:当左侧为 undefined/null 时,返回默认值
const district = optionalData.address?.district ?? "未知区域";
console.log(district); // 输出: "未知区域"
(5)数组遍历:forEach、map、filter
当 JSON 数据是数组时,常用数组方法遍历并提取数据:
const products = [
{"id": 1, "name": "手机", "price": 4999},
{"id": 2, "name": "电脑", "price": 8999}
];
// 提取所有商品名称(map)
const productNames = products.map(p => p.name);
console.log(productNames); // 输出: ["手机", "电脑"]
// 筛选价格低于 6000 的商品(filter)
const cheapProducts = products.filter(p => p.price < 6000);
console.log(cheapProducts); // 输出: [{"id": 1, "name": "手机", "price": 4999}]
Python:字典与列表的灵活操作
Python 中,JSON 数据通过 json 模块解析为字典(dict)和列表(list),操作方式与原生数据类型一致。
(1)解析 JSON 字符串为 Python 字典/列表
import json
json_string = '{"name": "周八", "scores": [85, 90, 78]}'
data_dict = json.loads(json_string)
print(data_dict) # 输出: {'name': '周八', 'scores': [85, 90, 78]}
(2)基本取值:键访问与索引
- 字典通过键取值(支持
get()方法避免 KeyError)。 - 列表通过索引取值(索引从 0 开始)。
# 字典取值
print(data_dict["name"]) # 输出: "周八"
print(data_dict.get("name")) # 输出: "周八"(更安全,键不存在时返回 None)
# 列表取值
print(data_dict["scores"][0]) # 输出: 85
(3)嵌套结构取值:逐层访问
nested_data = {
"school": {
"class": "高三(1)班",
"students": [
{"name": "吴九", "math": 95},
{"name": "郑十", "math": 88}
]
}
}
# 取学生姓名列表
student_names = [student["name"] for student in nested_data["school"]["students"]]
print(student_names) # 输出: ["吴九", "郑十"]
(4)安全取值:dict.get() 与 try-except
当键可能不存在时,get() 方法可避免报错:
# 键不存在时,get() 返回 None(可指定默认值)
print(data_dict.get("age", 0)) # 输出: 0


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