每天认识一个python库——json
·
json模块详解
json模块是Python标准库中处理JSON数据的核心模块,提供在Python对象和JSON数据格式之间转换的功能。
目录
一、包结构
Lib/json/
├── __init__.py # 主接口文件
├── decoder.py # JSON解码实现
├── encoder.py # JSON编码实现
├── scanner.py # 词法分析器
└── tool.py # 命令行工具支持
二、主要方法
json.dumps(): 将python对象编码成json字符串json.dump(): 将python对象编码成json字符串,并写入文件json.loads(): 将json字符串解码成python对象json.load(): 从文件中读取json字符串,并解码成python对象
1. json.dumps()
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- 功能:将Python对象编码成JSON字符串。
- 常用参数:
- obj:要序列化的Python对象。
- skipkeys:为True时,字典的key如果不是基本类型(str、int、float、bool、None)会被跳过,默认False。
- ensure_ascii:为True时,所有非ASCII字符会被转义,默认True。
- indent:指定缩进格式,常用于美化输出,默认None。
- separators:指定分隔符,默认(', ', ': ')。
- sort_keys:为True时,字典按key排序,默认False。
- 示例:
import json
data = {'name': '张三', 'age': 18}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)
# 输出:
# {
# "name": "张三",
# "age": 18
# }
2. json.dump()
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- 功能:将Python对象编码成JSON格式并写入文件。
- 参数同dumps,新增:
- fp:文件类对象(有write方法)。
- 示例:
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 文件data.json内容:
# {
# "name": "张三",
# "age": 18
# }
3. json.loads()
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 功能:将JSON字符串解码为Python对象。
- 常用参数:
- s:JSON格式字符串。
- object_hook:自定义对象解码函数,用于将字典转换为自定义Python对象。
- cls:自定义解码器类,必须是JSONDecoder的子类。
- parse_float:解析JSON数字为浮点数时使用的函数,默认使用float()。
- parse_int:解析JSON数字为整数时使用的函数,默认使用int()。
- parse_constant:解析JSON特殊值(如-Infinity, Infinity, NaN)的函数。
- object_pairs_hook:类似object_hook,但接收的是有序键值对列表而非字典。
- 示例:
json_str = '{"name": "张三", "age": 18}'
data = json.loads(json_str)
print(data)
# 输出:
# {'name': '张三', 'age': 18}
4. json.load()
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 功能:从文件读取JSON数据并解码为Python对象。
- 参数同loads,新增:
- fp:文件类对象。
- 示例:
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data)
# 输出:
# {'name': '张三', 'age': 18}
三、不常用方法和属性
1. JSONEncoder
- 功能:自定义JSON编码器,继承并重写default方法可实现自定义对象序列化。
- 示例:
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, complex):
return {'real': obj.real, 'imag': obj.imag}
return super().default(obj)
json_str = json.dumps(1+2j, cls=MyEncoder)
print(json_str)
# 输出:{"real": 1.0, "imag": 2.0}
2. JSONDecoder
- 功能:自定义JSON解码器。
- 用于扩展json.loads等解码行为,通常无需自定义。
3. JSONDecodeError
- 功能:解码失败时抛出的异常。
- 示例:
try:
json.loads('错误json')
except json.JSONDecodeError as e:
print('解码失败:', e)
# 输出:解码失败: Expecting value: line 1 column 1 (char 0)
4. 其他辅助模块
- decoder.py、encoder.py、scanner.py、tool.py:分别实现了解码、编码、扫描和工具函数,通常无需直接调用。
四、Python与JSON类型转换对照表
| Python类型 | JSON类型 | 说明 |
|---|---|---|
| dict | object | 字典 |
| list, tuple | array | 列表、元组 |
| str | string | 字符串 |
| int, float | number | 数字 |
| True | true | 布尔值true |
| False | false | 布尔值false |
| None | null | 空值 |
更多推荐
所有评论(0)