JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,Python 通过 json 模块提供了 JSON 数据的编码和解码功能。

1. 核心函数概览

函数描述常用场景
json.load()从文件读取并解析 JSON 数据读取 JSON 文件
json.loads()从字符串解析 JSON 数据处理 API 响应
json.dump()将 Python 对象写入 JSON 文件数据持久化
json.dumps()将 Python 对象转为 JSON 字符串网络传输

2. JSON 解码(读取/解析)

2.1 json.load()

从文件对象读取 JSON 数据并解码为 Python 对象。

语法:

python

复制

json.load(fp, *, cls=None, object_hook=None, parse_float=None, 
          parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

示例:

python

复制

import json

with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

参数说明:

  • fp: 文件对象(必须可读)

  • object_hook: 自定义字典解码函数

  • parse_float: 自定义浮点数解码

  • parse_int: 自定义整数解码

2.2 json.loads()

从字符串解析 JSON 数据。

语法:

python

复制

json.loads(s, *, cls=None, object_hook=None, parse_float=None, 
           parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

示例:

python

复制

json_str = '{"name": "John", "age": 30}'
data = json.loads(json_str)

3. JSON 编码(写入/序列化)

3.1 json.dump()

将 Python 对象编码为 JSON 并写入文件。

语法:

python

复制

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

复制

data = {"name": "张三", "age": 25}

with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

3.2 json.dumps()

将 Python 对象编码为 JSON 字符串。

语法:

python

复制

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

复制

data = {"name": "李四", "scores": [95, 88, 92]}
json_str = json.dumps(data, indent=2, ensure_ascii=False)

4. 高级功能

4.1 自定义编码器(JSONEncoder)

处理无法默认序列化的对象。

示例:

python

复制

from datetime import datetime
import json

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)

data = {"event": "会议", "time": datetime.now()}
json_str = json.dumps(data, cls=CustomEncoder)

4.2 自定义解码器

示例:

python

复制

def datetime_decoder(dct):
    if 'time' in dct:
        try:
            dct['time'] = datetime.fromisoformat(dct['time'])
        except (ValueError, KeyError):
            pass
    return dct

json_str = '{"event": "会议", "time": "2023-07-20T14:30:00"}'
data = json.loads(json_str, object_hook=datetime_decoder)

5. 参数详解

5.1 常用参数

参数描述默认值
ensure_ascii是否转义非ASCII字符True
indent缩进空格数(美化输出)None
sort_keys是否按键排序False
separators指定分隔符(',', ':')

5.2 安全相关参数

参数描述
allow_nan是否允许NaN等特殊浮点值
check_circular是否检查循环引用

6. 异常处理

异常描述
json.JSONDecodeErrorJSON解析错误
TypeError无法序列化的对象
ValueError循环引用等值错误

处理示例:

python

复制

try:
    data = json.loads(invalid_json_str)
except json.JSONDecodeError as e:
    print(f"JSON解析错误: {e}")

7. 最佳实践

  1. 文件操作始终使用上下文管理器

    python

    复制

    with open('data.json') as f:
        data = json.load(f)
  2. 处理非ASCII内容

    python

    复制

    json.dumps(data, ensure_ascii=False)
  3. 性能考虑

    • 大文件使用 ijson 等流式解析库

    • 生产环境考虑紧凑格式(indent=None

  4. 安全性

    • 不要解析不受信任的JSON数据

    • 考虑使用 json.JSONDecoder 的严格模式

8. 完整示例

python

复制

import json
from datetime import datetime

# 自定义编码器
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)

# 编码示例
data = {
    "name": "王五",
    "age": 28,
    "register_date": datetime.now(),
    "skills": ["Python", "SQL"]
}

# 序列化为字符串
json_str = json.dumps(data, cls=CustomEncoder, ensure_ascii=False, indent=2)
print("JSON字符串:")
print(json_str)

# 写入文件
with open('user.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, cls=CustomEncoder, ensure_ascii=False)

# 从文件读取
with open('user.json', 'r', encoding='utf-8') as f:
    loaded_data = json.load(f)
    print("\n从文件加载的数据:")
    print(loaded_data)

9. 总结对比表

操作文件字符串
编码json.dump()json.dumps()
解码json.load()json.loads()

通过掌握这些函数和技巧,您可以高效地在Python中处理各种JSON数据交换场景。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐