JSON内数据轻松取:从入门到熟练的实用指南
在数据交互的世界里,JSON(JavaScript Object Notation)以其轻量、易读、易解析的特性,已成为前后端通信、API数据交换、配置文件存储的主流格式,无论是调用API获取天气信息,还是读取本地配置文件,我们都离不开“从JSON中提取数据”这一核心操作,本文将手把手教你如何轻松获取JSON内的数据,从基础概念到进阶技巧,让你从“JSON小白”变为“取数高手”。
先搞懂:JSON长什么样?
要取数据,得先认识JSON的“结构”,JSON本质上是一个键值对(Key-Value Pair)的集合,类似于Python中的字典、JavaScript中的对象,主要分为两种结构:
对象(Object):用 包裹,键值对集合
以 开头, 内部由多个“键:值”对组成,键和值之间用冒号 分隔,键值对之间用逗号 分隔。键必须是字符串(双引号包围),值可以是字符串、数字、布尔值、数组、对象甚至null。
示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语", "编程"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
数组(Array):用 [] 包裹,有序值列表
以 [ 开头,] 内部是多个值的有序集合,值之间用逗号 分隔。数组的值可以是任意JSON类型(包括对象、数组等)。
示例(数组的值是对象):
[
{"id": 1, "product": "手机", "price": 3999},
{"id": 2, "product": "电脑", "price": 7999},
{"id": 3, "product": "平板", "price": 2999}
]
核心操作:从JSON中取数据的3种方法
根据JSON数据的来源(字符串、文件、API响应),取数据的方式略有不同,但核心逻辑一致:先解析成程序中的原生对象(如Python的字典、JavaScript的对象),再通过键或索引访问。
方法1:手动解析(适用于简单JSON字符串)
如果JSON数据直接以字符串形式存在(比如从配置文件读取或API返回的原始文本),需先通过JSON解析器将其转换为程序中的对象,再取值。
Python示例
Python内置 json 模块,用 json.loads()(字符串转字典/列表)解析:
import json
# 假设这是从API返回的JSON字符串
json_str = '''
{
"name": "张三",
"age": 25,
"courses": ["数学", "英语"],
"address": {"city": "北京"}
}
'''
# 1. 解析为Python字典
data = json.loads(json_str)
# 2. 取值:通过键访问(对象)或索引(数组)
print(data["name"]) # 输出: 张三
print(data["courses"][0]) # 输出: 数学(数组用索引)
print(data["address"]["city"]) # 输出: 北京(嵌套对象)
JavaScript示例
JavaScript原生支持JSON,用 JSON.parse() 解析字符串:
// 假设这是从API返回的JSON字符串
const jsonStr = `
{
"name": "张三",
"age": 25,
"courses": ["数学", "英语"],
"address": {"city": "北京"}
}
`;
// 1. 解析为JavaScript对象
const data = JSON.parse(jsonStr);
// 2. 取值:通过键访问(对象)或索引(数组)
console.log(data.name); // 输出: 张三(也可用 data["name"])
console.log(data.courses[0]); // 输出: 数学
console.log(data.address.city); // 输出: 北京
方法2:读取本地JSON文件(开发中常用)
如果JSON数据存储在本地文件中(如 config.json、data.json),需先读取文件内容,再按方法1解析。
Python示例
用 json.load()(文件对象转字典/列表),直接读取并解析文件:
import json
# 假设当前目录有 data.json 文件,内容同方法1的json_str
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f) # 直接从文件流解析
print(data["name"]) # 输出: 张三
print(data["courses"][1]) # 输出: 英语
JavaScript示例(Node.js环境)
Node.js中通过 fs 模块读取文件,再解析:
const fs = require("fs");
const path = require("path");
// 读取JSON文件(需指定utf-8编码,否则返回Buffer)
const jsonData = fs.readFileSync(
path.join(__dirname, "data.json"),
"utf-8"
);
// 解析为对象
const data = JSON.parse(jsonData);
console.log(data.name); // 输出: 张三
console.log(data.address); // 输出: { city: "北京" }
方法3:处理API返回的JSON(实际开发高频场景)
调用RESTful API时,服务器通常返回JSON格式的响应数据(如 requests 库的 response.json(),fetch API的 response.json())。
Python示例(用 requests 库调用天气API)
假设调用“和风天气”API获取北京天气,返回JSON如下:
{
"code": "200",
"now": {
"text": "晴",
"temp": "28",
"windDir": "东北风"
}
}
取值代码:
import requests
url = "https://api.qweather.com/v7/weather/now?location=101010100&key=你的API密钥"
response = requests.get(url)
# 1. 直接用 response.json() 解析(自动处理JSON)
data = response.json()
# 2. 取值
print(f"天气: {data['now']['text']}") # 输出: 天气: 晴
print(f"温度: {data['now']['temp']}℃") # 输出: 温度: 28℃
JavaScript示例(用 fetch API调用接口)
// 调用GitHub API获取用户信息
const username = "octocat"; // GitHub用户名
fetch(`https://api.github.com/users/${username}`)
.then(response => {
// 检查响应状态(如200、404等)
if (!response.ok) {
throw new Error("网络响应异常");
}
return response.json(); // 解析JSON
})
.then(data => {
console.log(`用户名: ${data.login}`); // 输出: 用户名: octocat
console.log(`粉丝数: ${data.followers}`); // 输出: 粉丝数: 3130
})
.catch(error => {
console.error("获取数据失败:", error);
});
进阶技巧:处理复杂JSON的取值场景
实际数据往往更复杂,比如多层嵌套、动态键、缺失值等,这些技巧能让你游刃有余。
多层嵌套对象/数组:逐层“剥洋葱”
JSON的核心优势是支持嵌套(对象里套对象、数组里套对象),取值时只需从外到内,一层层通过键或索引访问。
示例JSON(多层嵌套):
{
"school": "清华大学",
"students": [
{
"id": 1,
"name": "李四",
"scores": {"math": 95, "english": 88}
},
{
"id": 2,
"name": "王五",
"scores": {"math": 76, "english": 92}
}
]
}
取值(Python):
import json
data = json.loads('''
{
"school": "清华大学",
"students": [
{"id": 1, "name": "李四", "scores": {"math": 95, "english": 88}},
{"id": 2, "name": "王五", "scores": {"math": 76, "english": 92}}
]
}
''')
# 取第一个学生的数学成绩
first_student_math = data["students"][0]["scores"]["math"]
print(f"第一个学生的数学成绩: {first_student_math}") # 输出:


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