什么是JSON嵌套结构
在日常开发中,我们经常遇到JSON格式的数据。有时候这些数据不是简单的键值对,而是层层包裹的结构,比如用户信息里包含地址,地址里又分省市区,这种就是典型的嵌套JSON。
举个例子,你从一个天气API拿到的数据可能长这样:
{
"city": "北京",
"weather": {
"temperature": "25°C",
"condition": "晴",
"forecast": [
{ "day": "周一", "high": "26°C" },
{ "day": "周二", "high": "28°C" }
]
}
}这种结构清晰但需要正确的方法来提取数据,否则容易出错。
用JavaScript解析嵌套JSON
前端最常用的就是JavaScript。假设上面的数据存在变量data里,可以直接通过点号逐层访问:
console.log(data.city); // 输出:北京
console.log(data.weather.temperature); // 输出:25°C
console.log(data.weather.forecast[0].day); // 输出:周一如果不确定某一层是否存在,建议加上判断,避免程序崩溃:
if (data && data.weather && data.weather.forecast) {
data.weather.forecast.forEach(item => {
console.log(item.day + "最高温" + item.high);
});
}Python中的处理方式
在Python里,一般用json模块加载字符串为字典对象。比如读取一段JSON文本:
import json
data_str = '{"name": "小明", "profile": {"age": 23, "city": "上海"}}'
data = json.loads(data_str)
print(data['name']) # 输出:小明
print(data['profile']['city']) # 输出:上海对于列表类型的嵌套,可以用循环遍历:
# 假设有多位用户
users_str = '[{"name":"张三","info":{"score":85}},{"name":"李四","info":{"score":92}}]'
users = json.loads(users_str)
for user in users:
print(f'{user["name"]}的分数是{user["info"]["score"]}')
# 输出:张三的分数是85,李四的分数是92处理深层嵌套的小技巧
当层级太多时,比如data.a.b.c.d.e,每次都写一长串容易出错。可以使用短路赋值或封装函数简化:
// JavaScript安全取值函数
function get(obj, path, defaultValue = null) {
const keys = path.split('.');
let result = obj;
for (let key of keys) {
if (result == null || typeof result !== 'object') return defaultValue;
result = result[key];
}
return result !== undefined ? result : defaultValue;
}
// 使用方式
get(data, 'weather.forecast.0.day', '未知') // 拿不到就返回“未知”这样即使中间某一层缺失也不会报错,适合处理来源不可控的接口数据。
实际场景中的常见问题
很多人在解析时会直接假设结构一定存在,结果一旦接口返回异常就页面崩溃。比如原本应该有avatar字段,但新注册用户没上传头像,返回null,这时候再访问avatar.url就会报错。
解决办法是在访问前做类型检查:
if (typeof user.avatar === 'object' && user.avatar !== null) {
img.src = user.avatar.url;
} else {
img.src = '/default-avatar.png';
}或者用现代语法的可选链(?.):
const url = user.avatar?.url ?? '/default-avatar.png';代码更简洁,兼容性方面注意IE不支持,需要转译。