Python的json库怎么用:从基础到实践的全面指南
在Python开发中,处理JSON(JavaScript Object Notation)数据是一项高频需求,JSON作为一种轻量级的数据交换格式,因其易读、易解析的特性,被广泛应用于Web开发、API接口、配置文件等场景,Python内置的json库为我们提供了简单高效的方法来处理JSON数据,本文将详细介绍json库的核心功能、使用方法及常见应用场景。
认识JSON与Python数据类型的对应关系
在开始使用json库前,需要明确JSON数据与Python数据类型的对应关系,这是正确解析和生成JSON的基础:
| JSON类型 | Python类型 |
|---|---|
| object(对象) | dict(字典) |
| array(数组) | list(列表) |
| string(字符串) | str(字符串) |
| number(数字) | int/float(整数/浮点数) |
| true/false | True/False(布尔值) |
| null | None(空值) |
核心功能:JSON的解析与生成
json库的核心功能包括将JSON字符串解析为Python对象(反序列化)和将Python对象转换为JSON字符串(序列化),主要通过loads()/load()和dumps()/dump()四个函数实现。
反序列化:将JSON字符串转为Python对象
(1)json.loads():从字符串解析
当JSON数据以字符串形式存在时,使用json.loads()(load string)将其转换为Python对象。
import json
# JSON字符串
json_str = '{"name": "Alice", "age": 25, "hobbies": ["reading", "coding"]}'
# 解析为Python字典
python_obj = json.loads(json_str)
print(python_obj)
# 输出:{'name': 'Alice', 'age': 25, 'hobbies': ['reading', 'coding']}
# 访问解析后的数据
print(python_obj["name"]) # 输出:Alice
print(python_obj["hobbies"][0]) # 输出:reading
注意:json_str必须是合法的JSON格式字符串,例如键必须用双引号()包裹,单引号会导致json.JSONDecodeError。
(2)json.load():从文件/流解析
当JSON数据存储在文件或文件类对象(如open()打开的文件)中时,使用json.load()(load)直接读取并解析。
假设有一个data.json为:
{
"city": "Beijing",
"population": 21540000,
"is_capital": true
}
通过json.load()读取:
import json
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data)
# 输出:{'city': 'Beijing', 'population': 21540000, 'is_capital': True}
序列化:将Python对象转为JSON字符串
(1)json.dumps():转换为字符串
当需要将Python对象(如字典、列表)转换为JSON字符串时,使用json.dumps()(dump string)。
import json
# Python字典
python_dict = {
"name": "Bob",
"age": 30,
"skills": ["Python", "Java"],
"is_student": False
}
# 转换为JSON字符串
json_str = json.dumps(python_dict)
print(json_str)
# 输出:{"name": "Bob", "age": 30, "skills": ["Python", "Java"], "is_student": false}
默认行为:dumps()会确保JSON格式合法,例如布尔值转为true/false(小写),None转为null。
(2)json.dump():写入文件
当需要将Python对象直接以JSON格式写入文件时,使用json.dump()(dump)。
import json
data = {
"product": "Laptop",
"price": 5999.99,
"in_stock": True
}
# 写入JSON文件(默认会覆盖文件)
with open("product.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
# 写入后文件内容:
# {
# "product": "Laptop",
# "price": 5999.99,
# "in_stock": true
# }
参数说明:
ensure_ascii=False:允许非ASCII字符(如中文)直接写入,避免转义(默认为True,非ASCII字符会转为\u转义序列)。indent=4:格式化输出,指定缩进空格数,提升可读性(默认为None,输出为一行紧凑字符串)。
进阶参数:定制序列化与反序列化行为
json库提供了多个参数,允许我们定制序列化和反序列化的过程,满足复杂场景需求。
序列化进阶参数(dumps()/dump())
(1)indent:格式化输出
通过indent参数控制缩进,使JSON更易读:
data = {"a": 1, "b": [2, 3], "c": {"d": 4}}
compact_json = json.dumps(data) # 无缩进
print(compact_json)
# 输出:{"a": 1, "b": [2, 3], "c": {"d": 4}}
pretty_json = json.dumps(data, indent=2) # 缩进2空格
print(pretty_json)
# 输出:
# {
# "a": 1,
# "b": [
# 2,
# 3
# ],
# "c": {
# "d": 4
# }
# }
(2)ensure_ascii:处理非ASCII字符
默认情况下,ensure_ascii=True,非ASCII字符(如中文)会被转义:
data = {"name": "张三", "city": "北京"}
json_str = json.dumps(data)
print(json_str)
# 输出:{"name": "\u5f20\u4e09", "city": "\u5317\u4eac"}
# 设置ensure_ascii=False,保留原字符
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
# 输出:{"name": "张三", "city": "北京"}
(3)sort_keys:按键排序
输出时对字典的键进行排序(默认为False,保持插入顺序):
data = {"c": 3, "a": 1, "b": 2}
sorted_json = json.dumps(data, sort_keys=True)
print(sorted_json)
# 输出:{"a": 1, "b": 2, "c": 3}
(4)default:处理不可序列化对象
当Python对象包含json库不支持的类型(如datetime、自定义类实例)时,可通过default参数指定转换函数:
from datetime import datetime
def datetime_handler(obj):
if isinstance(obj, datetime):
return obj.isoformat() # 将datetime转为ISO格式字符串
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
data = {"time": datetime.now(), "value": 42}
json_str = json.dumps(data, default=datetime_handler)
print(json_str)
# 输出:{"time": "2023-10-01 12:00:00.123456", "value": 42}
反序列化进阶参数(loads()/load())
(1)object_hook:自定义字典解析
当需要将JSON解析的字典转换为自定义类时,可通过object_hook参数指定转换函数:
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"User(name={self.name}, age={self.age})"
def user_decoder(dct):
if "name" in dct and "age" in dct:
return User(dct["name"], dct["age"])
return dct
json_str = '{"name": "Charlie", "age": 28}'
user = json.loads(json_str, object_hook=user_decoder)
print(user)
# 输出:User(name=Charlie, age=28)
(2)parse_float/parse_int:自定义数字解析
默认情况下,JSON数字会转为Python的float或int,可通过参数指定自定义解析逻辑(例如转为decimal.Decimal):
from decimal import



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