Python怎么处理JSON数据类型:从基础到实战
在数据交互的世界里,JSON(JavaScript Object Notation)以其轻量级、易读、跨语言的特性,成为前后端通信、API数据交换、配置文件存储等场景的主流格式,Python作为数据科学和Web开发的核心语言,内置了强大的JSON处理模块,让开发者能高效地解析、生成和操作JSON数据,本文将从基础概念出发,结合代码示例,系统介绍Python处理JSON数据的核心方法与实战技巧。
认识JSON:Python中的“桥梁”数据格式
JSON本质上是一种文本格式,用于表示结构化数据,其核心结构包括:
- 对象(Object):键值对集合,类似Python的字典(
dict),键为字符串,值可以是任意类型,如{"name": "Alice", "age": 25}。 - 数组(Array):有序值列表,类似Python的列表(
list),如["apple", "banana", 123]。 - 值(Value):支持字符串、数字、布尔值(
true/false)、null(对应Python的None)、对象或数组。
Python的json模块(内置模块,无需安装)专门用于处理JSON数据,核心功能包括:将Python对象转换为JSON字符串(序列化)、将JSON字符串转换为Python对象(反序列化)。
核心操作:序列化与反序列化
序列化:将Python对象转为JSON字符串
当需要将Python数据(如字典、列表)通过网络传输或存储到文件时,需通过json.dumps()(dump string)将其转换为JSON格式字符串。
示例:基本序列化
import json
# Python字典
data = {
"name": "Bob",
"age": 30,
"hobbies": ["reading", "coding"],
"is_student": False
}
# 转换为JSON字符串
json_str = json.dumps(data)
print(json_str)
# 输出: {"name": "Bob", "age": 30, "hobbies": ["reading", "coding"], "is_student": false}
进阶:格式化输出(缩进、排序)
默认情况下,json.dumps()输出的JSON字符串是紧凑格式(无多余空格),若需提高可读性(如调试或配置文件),可通过indent参数添加缩进,sort_keys参数对键排序:
formatted_json = json.dumps(data, indent=4, sort_keys=True)
print(formatted_json)
# 输出(部分):
{
"age": 30,
"hobbies": [
"coding",
"reading"
],
"is_student": false,
"name": "Bob"
}
注意:Python类型与JSON类型的映射关系
| Python类型 | JSON类型 |
|------------|----------------|
| dict | Object |
| list/tuple | Array |
| str | String |
| int/float | Number |
| True/False | Boolean |
| None | null |
若Python对象包含不可直接序列化的类型(如datetime、自定义类),需通过default参数指定转换函数,
from datetime import datetime
def handle_datetime(obj):
if isinstance(obj, datetime):
return obj.isoformat() # 转换为ISO格式字符串
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
data_with_time = {"time": datetime.now()}
json_str = json.dumps(data_with_time, default=handle_datetime)
print(json_str) # 输出: {"time": "2023-10-01 12:00:00.000000"}
反序列化:将JSON字符串转为Python对象
当接收到JSON格式数据(如API响应、文件内容)时,需通过json.loads()(load string)将其转换为Python原生对象(字典、列表等)。
示例:基本反序列化
json_str = '{"name": "Alice", "age": 25, "hobbies": ["painting", "hiking"]}'
# 转换为Python字典
python_obj = json.loads(json_str)
print(python_obj)
# 输出: {'name': 'Alice', 'age': 25, 'hobbies': ['painting', 'hiking']}
# 访问数据
print(python_obj["name"]) # 输出: Alice
print(python_obj["hobbies"][0]) # 输出: painting
处理JSON数组
若JSON字符串是纯数组(如'["apple", "orange", "banana"]'),反序列化后得到Python列表:
json_array = '["apple", "orange", "banana"]' fruit_list = json.loads(json_array) print(fruit_list) # 输出: ['apple', 'orange', 'banana']
文件操作:直接读写JSON文件
实际开发中,JSON数据常存储在文件中(如配置文件config.json、数据集data.json)。json模块提供了json.dump()(写入文件)和json.load()(读取文件)方法,避免手动处理文件IO。
将Python对象写入JSON文件
使用json.dump(),直接将对象序列化并写入文件(无需手动调用dumps):
data = {
"users": [
{"name": "Charlie", "age": 28},
{"name": "Diana", "age": 32}
],
"version": "1.0"
}
# 写入JSON文件(默认覆盖,若需追加需打开文件时指定模式)
with open("users.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False) # ensure_ascii=False支持中文
执行后,当前目录会生成users.json为:
{
"users": [
{
"name": "Charlie",
"age": 28
},
{
"name": "Diana",
"age": 32
}
],
"version": "1.0"
}
从JSON文件读取Python对象
使用json.load(),直接从文件读取JSON内容并反序列化:
with open("users.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
print(loaded_data)
# 输出: {'users': [{'name': 'Charlie', 'age': 28}, {'name': 'Diana', 'age': 32}], 'version': '1.0'}
print(loaded_data["users"][0]["name"]) # 输出: Charlie
实战案例:处理API响应的JSON数据
假设我们需要调用一个天气API,获取北京市的天气信息(以JSON格式返回),并解析其中的关键数据。
模拟API响应(JSON字符串)
api_response = '''
{
"code": 200,
"msg": "success",
"data": {
"city": "北京",
"weather": "晴",
"temperature": 25,
"humidity": 60,
"forecast": [
{"day": "周一", "temp": "26/18"},
{"day": "周二", "temp": "27/19"}
]
}
}
'''
# 反序列化为Python对象
weather_data = json.loads(api_response)
# 提取关键信息
city = weather_data["data"]["city"]
weather = weather_data["data"]["weather"]
temp = weather_data["data"]["temperature"]
forecast = weather_data["data"]["forecast"]
print(f"城市:{city}")
print(f"天气:{weather}")
print(f"温度:{temp}℃")
print("未来2天预报:")
for day_info in forecast:
print(f"{day_info['day']}: {day_info['temp']}℃")
输出结果:
城市:北京
天气:晴
温度:25℃
未来2天预报:
周一: 26/18℃
周二: 27/19℃
常见问题与解决方案
JSON字符串中包含单引号?
json.loads()要求JSON字符串使用双引号,若遇到单引号(如"{'name': 'Eve'}"),会抛出json.JSONDecodeError,解决方法:用json.loads()前,通过replace()替换单引号为双引号(但需确保字符串结构合法):
invalid_json = "{'name': 'Eve'}" # 单引号,非法JSON
valid_json = invalid_json.replace("'", '"') # 替换为双引号
data = json.loads(valid_json)
print(data) # 输出: {'name': 'Eve'}


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