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类型说明
dictobject字典
list, tuplearray列表、元组
strstring字符串
int, floatnumber数字
Truetrue布尔值true
Falsefalse布尔值false
Nonenull空值
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐